# ChatGPT는 Cloudflare가 React 상태를 읽을 때까지 입력을 차단함

> Clean Markdown view of GeekNews topic #28003. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=28003](https://news.hada.io/topic?id=28003)
- GeekNews Markdown: [https://news.hada.io/topic/28003.md](https://news.hada.io/topic/28003.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-03-30T11:33:54+09:00
- Updated: 2026-03-30T11:33:54+09:00
- Original source: [buchodi.com](https://www.buchodi.com/chatgpt-wont-let-you-type-until-cloudflare-reads-your-react-state-i-decrypted-the-program-that-does-it/)
- Points: 4
- Comments: 1

## Topic Body

- ChatGPT의 메시지 전송 시 **Cloudflare Turnstile 프로그램**이 실행되어 브라우저 지문뿐 아니라 **React 애플리케이션 상태**까지 검사함
- 복호화된 프로그램은 **55개 속성**을 수집하며, 브라우저·네트워크·애플리케이션 3계층으로 나뉜 검증 절차를 수행함
- React 렌더링이 완료된 실제 SPA 환경에서만 통과 가능해, **헤드리스 브라우저나 단순 봇 요청은 실패**함
- 수집된 지문은 암호화되어 **`OpenAI-Sentinel-Turnstile-Token`** 으로 변환되고, 여기에 **Signal Orchestrator**와 **Proof of Work** 모듈이 추가로 동작함
- Cloudflare 서버만 복호화 키를 알고 있어, **프라이버시 경계가 기술이 아닌 정책으로 결정되는 구조**임

---

### ChatGPT 메시지 전송 시 Cloudflare Turnstile 동작 구조 분석
- **ChatGPT의 모든 메시지 전송 시** 브라우저 내에서 **Cloudflare Turnstile 프로그램**이 자동 실행됨
  - 네트워크 트래픽에서 377개의 Turnstile 프로그램을 복호화한 결과, 일반적인 브라우저 지문 수집을 넘어 **React 애플리케이션 상태까지 검사**함
  - 단순한 브라우저 지문 위조 봇은 통과하지 못하고, **ChatGPT의 SPA(단일 페이지 애플리케이션)** 을 완전히 렌더링해야 검증 통과 가능

### 암호화 구조와 복호화 과정
- Turnstile 바이트코드는 서버 응답의 `turnstile.dx` 필드로 전달되며, **매 요청마다 28,000자 길이의 base64 문자열**로 암호화되어 있음
  - 외부 암호화층은 `p` 토큰과 XOR 연산으로 복호화 가능하며, 두 값은 동일한 HTTP 요청 내에서 교환됨
  - 복호화된 결과는 **89개의 VM 명령어**로 구성된 JSON 형태의 바이트코드
- 내부에는 **19KB 크기의 추가 암호화 블롭(blob)** 이 존재하며, 이 블롭은 다른 XOR 키로 암호화되어 있음
  - 키는 바이트코드 내부의 **float 리터럴 값(예: 97.35)** 로 포함되어 있으며, 서버가 생성하여 브라우저로 전송
  - 50회 요청 모두에서 동일한 방식으로 유효한 JSON 복호화 확인
- 전체 복호화 절차는 다음 5단계로 구성
  1. `p` 토큰을 요청에서 읽음
  2. 응답의 `turnstile.dx`를 읽음
  3. `XOR(base64decode(dx), p)` → 외부 바이트코드 생성
  4. 19KB 블롭 뒤의 5인자 명령어에서 마지막 인자를 키로 추출
  5. `XOR(base64decode(blob), str(key))` → 내부 프로그램 복호화 (417~580개 명령어)

### 복호화된 프로그램의 검사 항목
- 내부 프로그램은 **28개의 명령어(opcode)** 를 가진 커스텀 VM으로 실행되며, 요청마다 부동소수 레지스터 주소가 무작위로 변경됨
- 총 **55개 속성(property)** 을 수집하며, 377개 샘플 모두 동일한 항목을 포함
- ## Layer 1: 브라우저 지문
  - **WebGL 관련 8개 속성**: `UNMASKED_VENDOR_WEBGL`, `UNMASKED_RENDERER_WEBGL`, `WEBGL_debug_renderer_info` 등
  - **화면 정보 8개**: `colorDepth`, `pixelDepth`, `width`, `height`, `availWidth`, `availHeight`, `availLeft`, `availTop`
  - **하드웨어 5개**: `hardwareConcurrency`, `deviceMemory`, `maxTouchPoints`, `platform`, `vendor`
  - **폰트 측정 4개**: 숨겨진 div 생성 후 `fontFamily`, `fontSize`, `getBoundingClientRect`, `innerText`로 렌더링 크기 측정
  - **DOM 탐색 8개**: `createElement`, `appendChild`, `removeChild`, `style`, `position`, `visibility`, `ariaHidden` 등
  - **저장소 5개**: `storage`, `quota`, `estimate`, `setItem`, `usage`
    - 결과를 `localStorage`의 키 `6f376b6560133c2c`에 저장하여 페이지 재로딩 간 지속
- ## Layer 2: Cloudflare 네트워크
  - **엣지 헤더 5개**: `cfIpCity`, `cfIpLatitude`, `cfIpLongitude`, `cfConnectingIp`, `userRegion`
  - 이 값들은 Cloudflare 네트워크를 통해서만 존재하며, **직접 오리진 서버에 접근하는 봇**은 누락되거나 불일치 값 발생
- ## Layer 3: 애플리케이션 상태
  - **React 내부 구조 3개**: `__reactRouterContext`, `loaderData`, `clientBootstrap`
  - 이 항목들은 ChatGPT의 React 애플리케이션이 완전히 렌더링되고 **SSR 하이드레이션이 완료된 경우에만 존재**
  - HTML만 로드하거나 JS 번들을 실행하지 않는 헤드리스 브라우저, 혹은 React를 실제로 실행하지 않는 봇 프레임워크는 실패

### 토큰 생성 과정
- 55개 속성 수집 후, 프로그램은 **116바이트 암호화 블롭**을 복호화하여 4개의 최종 명령어를 실행
  - `JSON.stringify(fingerprint)` → `store` → `XOR(json, key)` → `RESOLVE`
  - 결과값은 `OpenAI-Sentinel-Turnstile-Token` 헤더로 변환되어 모든 대화 요청에 포함

### Sentinel의 추가 구성 요소
- **Turnstile** 외에도 두 가지 추가 검증 모듈 존재
- ## Signal Orchestrator
  - 271개 명령어로 구성
  - `keydown`, `pointermove`, `click`, `scroll`, `paste`, `wheel` 이벤트 리스너를 설치
  - `window.__oai_so_*` 속성 36개를 추적하여 **키 입력 타이밍, 마우스 속도, 스크롤 패턴, 유휴 시간, 붙여넣기 이벤트** 등을 모니터링
  - 지문 수집 외에 **행동 기반 생체 인증 계층** 역할 수행
- ## Proof of Work
  - **25개 필드 지문 + SHA-256 hashcash** 기반
  - 난이도는 400K~500K 범위의 균등 난수, 72%가 5ms 이하로 해결
  - `ai`, `createPRNG`, `cache`, `solana`, `dump`, `InstallTrigger`, `data` 등 7개 이진 탐지 플래그 포함 (100개 샘플 모두 0)
  - 연산 비용을 추가하지만 **주요 방어 수단은 아님**

### 토큰 복호화 가능 주체와 보안 의미
- 내부 프로그램의 XOR 키는 서버가 생성하여 바이트코드에 포함되므로, **`turnstile.dx`를 생성한 서버만이 키를 알고 있음**
- 사용자와 시스템 운영자 간의 프라이버시 경계는 **암호학적 제약이 아닌 정책적 결정**에 의해 정의됨
- 난독화의 목적은
  - 지문 수집 항목을 정적 분석으로부터 숨김
  - 웹사이트 운영자(OpenAI)가 원시 지문값을 직접 읽지 못하도록 차단
  - 각 토큰을 고유하게 만들어 **재사용(replay)** 방지
  - Cloudflare가 검사 항목을 변경해도 외부에서 인지하기 어렵게 함
- 그러나 암호화는 **동일 데이터 스트림 내 키와 XOR 연산**으로 이루어져 있어, **분석 방지 수준의 난독화**에 불과함

### 수집 및 분석 통계
| 항목 | 값 |
| --- | --- |
| 복호화된 프로그램 | 377/377 (100%) |
| 관찰된 고유 사용자 | 32 |
| 프로그램당 속성 수 | 55 (모두 동일) |
| 명령어 수 | 417–580 (평균 480) |
| XOR 키 (50 샘플) | 41개 |
| Signal Orchestrator 속성 | 36개 |
| Proof of Work 필드 | 25개 |
| PoW 해결 시간 | 72%가 5ms 이하 |

### 분석 방법론
- **합법적 절차로 수집된 트래픽**만 사용
- 개인 사용자 데이터는 공개되지 않음
- 모든 트래픽은 **참여자 동의 하에 관찰**
- Sentinel SDK(`sdk.js`, 1,411줄)를 **수동 디옵스케이션 및 오프라인 복호화** 수행
- 복호화는 Python을 이용해 오프라인 환경에서 진행

## Comments



### Comment 54119

- Author: neo
- Created: 2026-03-30T11:33:54+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=47566865) 
- 안녕하세요, 나는 OpenAI의 **Integrity 팀**에서 일하는 Nick임  
  이번 점검은 봇, 스크래핑, 사기 등 플랫폼 **남용 방지**를 위한 보호 조치의 일부임  
  무료 및 비로그인 사용자에게 접근을 계속 제공하기 위해 GPU 자원을 실제 사용자에게 우선 배분하려는 목적이 있음  
  페이지 로드 시간, 첫 토큰까지의 시간, 페이로드 크기 등을 모니터링하며 보호 조치의 **오버헤드 최소화**에 집중하고 있음  
  대부분의 사용자에게는 영향이 미미하며, 극히 일부만 약간의 지연을 경험할 수 있음  
  또한 **오탐률**을 줄이면서도 남용을 어렵게 만드는 정밀도 개선을 지속적으로 평가 중임
  - OpenAI가 **스크래핑을 남용으로 간주**한다는 점이 흥미로움
  - 요즘은 필수 서비스 이용을 위해 모든 클라이언트 검증을 허용하는 브라우저 하나, 그리고 추적 방지를 위한 또 다른 브라우저 하나가 필요한 상황임  
    Nick의 설명은 이해하지만, **프라이버시와 기능성** 중 하나를 선택해야 하는 세상이 계속될지 궁금함
  - 관련된 문제인지는 모르겠지만, 긴 대화에서는 **Chat UI 성능이 매우 나빠짐**  
    입력 지연, 렌더링 끊김, 완전 멈춤까지 발생함  
    iPhone 16 Safari와 MacBook Pro M3 Chrome에서 동일하게 겪고 있음
  - 새 계정이 댓글 두 개만 남겼는데, 정말 사람인지 **OpenAI를 방어하는 봇**인지 어떻게 알 수 있을까 의심됨  
    Cloudflare의 프라이버시 침해 도구를 돌려서 결과를 공유해보라는 농담 섞인 제안도 있음
  - 직접 OpenAI 관계자의 답변을 들으니 반가움  
    나는 Pro 구독자이며 팀 전체가 매달 2천 달러 이상을 쓰고 있음  
    하지만 **VPN(Mullvad)** 을 사용할 때 로그인 상태에서도 Chat 인터페이스가 자주 끊기거나 타임아웃이 남  
    유료 사용자라면 VPN 사용 여부와 상관없이 안정적으로 이용할 수 있으면 좋겠음

- **Cloudflare**가 ‘의심스러운’ 브라우저나 IP를 이유로 웹을 거의 쓸 수 없게 만든다는 불만임  
  Firefox를 쓴다는 이유만으로 **캡차 지옥**에 빠졌다고 표현함
  - Cloudflare의 ‘의심스러운’ 정의가 계속 확장되고 있음  
    VPN, 프라이버시 중심 브라우저, 희귀 IP 대역 등 **프라이버시를 중시하는 사용자**가 오히려 가장 많이 걸림  
    정작 봇은 이런 필터를 쉽게 우회함
  - 혹시 네트워크에서 모르는 웹 트래픽이 나가는지 확인해보라는 제안임  
    자신은 Firefox를 쓰지만 정상적인 수준의 캡차만 본다고 함
  - Firefox + Ublock Origin 조합으로 쓰는데 **캡차를 거의 본 적이 없음**  
    CGNAT을 끈 상태라 혹시 그게 차이를 만드는지 궁금함
  - 결제 직후 **15번 연속 캡차**를 푼 황당한 경험을 공유함  
    은행에서 이미 본인 인증을 했는데, 사이트가 사람인지 아닌지 구분 못 하는 건 이해하기 어렵다고 함

- OpenAI가 비로그인 사용자에게 **무료 ChatGPT**를 제공하기 때문에, 이를 **무료 API처럼 악용하지 않도록** 보호하려는 것 같음
  - 로그인 여부와 상관없이 이런 검증을 하는지 궁금함  
    Android 앱에서는 **Play Integrity** 체크가 동작하는데, Claude 앱은 로그인만 요구하고 이런 검증은 없음
  - 로그인 없이도 ChatGPT가 작동한 경험을 공유함  
    쿠키나 계정 없이도 질문을 입력하자 답변이 나와서 놀랐다고 함
  - 이런 보호는 **Pro 구독자 사용 패턴 보호** 목적도 있음  
    API 대비 구독형 요금이 훨씬 저렴하므로 남용 방지가 필요함  
    SPA 로드 체크 정도는 큰 장벽이 아니며, 이를 인지한 사람은 이미 우회할 기술이 있음  
    다른 기업들도 각자 **안티봇 시스템**을 구축하고 있음
  - 월 20달러에 GPT‑5.2를 쓰는 건 **가성비가 너무 좋음**, 언젠가 가격 조정이 올 것 같음
  - copilot.microsoft.com도 비슷한 **Cloudflare 기반 보호**를 쓰는 듯함

- ChatGPT의 **React 앱이 완전히 렌더링**되어야 특정 속성이 존재한다는 점이 흥미로움  
  이는 브라우저 수준이 아닌 **애플리케이션 레이어의 봇 탐지** 방식임  
  대부분의 고급 탐지 시스템이 이런 식으로 동작한다고 생각했는데, 이번 발견이 특별한 의미가 있는지 궁금함

- 글쓴이가 왜 이 문제를 중요하게 여겨야 하는지 더 명확히 설명했으면 좋겠음  
  결국 OpenAI는 사용자가 **공식 React 앱을 사용하길 원한다**는 내용인데, 그게 문제인지 잘 모르겠음
  - 그래서 그 글이 **AI가 쓴 듯한 품질 낮은 글**처럼 느껴졌다고 함

- 기술적인 관점에서 흥미로움  
  Turnstile은 기본적으로 사이트별 설정이 없는 것으로 아는데, OpenAI는 어떻게 **Turnstile 데이터를 자체 API와 결합**했는지 궁금함

- 왜 봇 운영자들이 그냥 **Windows 11 VM + Chrome**을 돌리지 않는지 이해가 안 된다는 의견임  
  메모리 중복 제거를 쓰면 50개 VM을 동시에 돌릴 수 있고, AWS 기준으로 **페이지 로드 1000회당 1센트** 수준이라 매우 저렴하다고 함
  - 이미 이런 기능을 **패키지로 제공하는 서비스**가 많음  
    IP 회전, 위치 스푸핑, 언어 설정, 파서 내장 등 옵션이 다양하고 전환 비용도 낮아 직접 구축할 이유가 적음
  - 실제로 이런 VM 기반 접근은 비용이 커서 **봇 수를 줄이는 억제 효과**가 있음  
    단순한 방법보다 훨씬 비싸기 때문임
  - 스크래핑 관련 **Reddit 커뮤니티**를 보면, 헤드리스 브라우저로 접근이 막히면 봇 개발자들이 매우 불만스러워함  
    제안처럼 Windows 대신 **Linux 컨테이너**를 쓰면 훨씬 가볍고 효율적임
  - GPU 패스스루 없이 **그래픽 가속이 잘 되는 Windows 11 VM**을 쉽게 돌리는 방법이 있다면 알려달라는 요청임

- ChatGPT가 작성한 듯한 **조잡한 기사**라는 비판임
  - “웹 블로그의 전통적 특징은 **초안이 너무 엉망이라 언어모델조차 두 번째 수정이 필요하다는 것**”이라며 농담함

- 2023~2024년에 **KeepChatGPT**라는 확장 프로그램을 사용했었음  
  API 없이도 사용자를 가장해 작동하는 방식이 흥미로웠음  
  이후 **Gemini 등장**과 잦은 오류로 사용을 중단했지만, AI 패널을 오른쪽으로 옮기는 옵션은 마음에 들었음  
  [KeepChatGPT GitHub 링크](https://github.com/xcanwin/keepchatgpt)
  - 자신은 **WinForms WebView**를 이용해 ChatGPT에 쿼리를 보내 JSON 응답을 받는 작은 헬퍼 앱을 씀  
    이 방식은 OpenAI의 **안티봇 시스템에 전혀 걸리지 않음**

- Cloudflare와 앱 간의 통합이 **표준 Turnstile을 넘어선 커스텀 기능**인지, 아니면 엔터프라이즈 전용인지 궁금하다는 질문임
