ChatGPT가 입력을 차단하는 이유: Cloudflare가 React 상태까지 읽고 있었다
안녕하세요, Tom입니다.
ChatGPT를 쓸 때 가끔 입력창이 잠깐 멈추는 경험, 해보신 적 있나요? 단순한 로딩이 아니었어요. Cloudflare Turnstile이 여러분의 브라우저를 검사하느라 입력을 차단하고 있었던 거예요. 한 보안 연구자가 Turnstile 프로그램 377개를 직접 복호화해서 그 실체를 낱낱이 공개했는데, 꽤 충격적이더라고요.
3단계 검증 시스템
Cloudflare Turnstile은 단순한 봇 탐지가 아니에요. 3개 레이어로 나눠서 총 55개 속성을 수집하고 있었어요.
1단계: 브라우저 지문 (28개 속성)
가장 광범위한 수집이 이루어지는 레이어예요.
- WebGL 데이터 (8개): GPU 벤더, 렌더러 정보, 확장 기능, 파라미터
- 화면 정보 (8개): 색 심도, 픽셀 심도, 화면 크기, 가용 좌표
- 하드웨어 (5개): CPU 코어 수, 디바이스 메모리, 터치 포인트, 플랫폼, 벤더
- 폰트 측정 (4개): 숨겨진 DOM 요소를 만들어서 렌더링된 텍스트를 측정
- 스토리지 (5개): 용량 추정,
6f376b6560133c2c라는 인코딩된 키로 localStorage 영속성 체크
이 정도면 여러분의 브라우저 환경을 사실상 "유일하게" 식별할 수 있어요.
2단계: 네트워크 레이어 (5개 속성)
Cloudflare 서버 사이드에서 주입되는 정보예요. IP 기반 도시/좌표, 접속 IP, 사용자 리전 등이 포함돼요. 이 값들이 없으면 직접 오리진 서버에 접속하거나 Cloudflare 프록시를 우회하고 있다는 뜻이라, 봇으로 의심받게 되더라고요.
3단계: 애플리케이션 상태 (3개 속성)
🎯 핵심은 여기예요. Turnstile이 React Router 내부 상태를 직접 읽고 있었어요.
__reactRouterContextloaderDataclientBootstrap
이 속성들은 React 하이드레이션이 완료된 후에만 존재해요. 즉, 진짜 브라우저에서 ChatGPT SPA가 완전히 부팅됐는지를 확인하는 거예요. 단순 HTTP 클라이언트나 헤드리스 브라우저로는 통과하기 어렵죠.
암호화? 난독화에 가까워요
수집된 데이터는 89개의 VM 인스트럭션으로 구성된 바이트코드에서 XOR 암호화를 거쳐 OpenAI-Sentinel-Turnstile-Token이라는 헤더로 모든 대화 요청에 포함돼요. 토큰 하나가 Base64로 약 28,000자나 되더라고요.
그런데 흥미로운 점은, XOR 키가 같은 데이터 스트림 안에 들어 있다는 거예요. 바이트코드에 직접 박혀 있는 float 값(예: 97.35)이 키로 사용되고, 연구자가 50건 이상의 요청에서 100% 성공률로 복호화에 성공했어요.
⚠️ 연구자의 결론: "난독화는 실질적인 운영 목적에 쓰이지만, 암호화 키가 같은 데이터 스트림에 있는 이상 분석을 막을 수는 없다."
행동 바이오메트릭스까지
지문 수집 외에도 Signal Orchestrator라는 모듈이 271개 인스트럭션으로 동작하면서 키 입력 타이밍, 마우스 속도, 스크롤 패턴, 붙여넣기 이벤트 등 36개 윈도우 속성을 추적하고 있었어요. 거기에 SHA-256 기반 해시캐시 Proof of Work까지 추가되어 있고요.
프라이버시 논란
OpenAI 무결성 팀의 Nick이라는 엔지니어는 "봇, 스크래핑, 사기 남용을 방지"하고 "실제 사용자에게 GPU 리소스를 우선 배정"하기 위한 조치라고 설명했어요.
하지만 커뮤니티에서는 우려의 목소리가 크더라고요.
- VPN 사용자나 프라이버시 중심 브라우저 사용자가 불균형하게 CAPTCHA에 걸린다는 점
- XOR 암호화는 진정한 암호학이 아니라 난독화에 불과하다는 점
- 프라이버시 경계가 암호학적 제약이 아닌 정책으로만 정의된다는 점
💡 개발자 시사점: React 앱을 만들 때, 외부 스크립트가 내부 상태에 접근할 수 있다는 걸 인지해야 해요. __reactRouterContext 같은 전역 객체는 누구나 읽을 수 있거든요. 보안이 중요한 상태는 클로저나 모듈 스코프 안에 격리하는 게 좋겠어요.
보안과 프라이버시 사이의 줄다리기는 끝이 없는 것 같아요. 봇을 막기 위한 조치가 합리적이긴 하지만, 55개 속성 수집이 좀 과하다는 생각도 드네요. 여러분은 어떻게 생각하시나요?
원문은 GeekNews에서 확인하실 수 있어요.