타이핑도 하기 전에 벌어지는 일
ChatGPT를 쓸 때 가끔 입력창이 잠깐 먹통이 되는 경험, 해보신 적 있나요? 그냥 로딩이 느린 건가 싶어서 넘어갔을 수도 있는데요. 알고 보니 그 짧은 순간에 꽤 흥미로운 일이 벌어지고 있었어요. Cloudflare의 보안 스크립트가 여러분의 브라우저에서 React 내부 상태를 읽고, 분석하고, 그 결과를 서버로 보내는 과정이 진행되고 있었거든요.
한 보안 연구자가 ChatGPT 웹사이트에서 실행되는 Cloudflare의 난독화된 JavaScript 코드를 직접 복호화하고 분석한 결과를 공개했는데요. 결론부터 말하면, 사용자가 실제로 사람인지 봇인지를 판별하기 위해 생각보다 훨씬 깊은 수준의 브라우저 정보를 수집하고 있었어요.
어떤 정보를 수집하고 있었나
보통 봇 탐지라고 하면 "나는 로봇이 아닙니다" 체크박스, 즉 CAPTCHA를 떠올리잖아요. 그런데 Cloudflare의 Turnstile이라는 시스템은 그것보다 훨씬 정교하게 동작해요. 사용자 눈에 보이지 않는 채로 백그라운드에서 조용히 검사를 수행하는 방식이에요.
이게 뭐냐면, 여러분이 웹페이지를 열면 JavaScript가 자동으로 실행되면서 브라우저의 각종 정보를 핑거프린팅(fingerprinting)하는 건데요. 핑거프린팅이란 브라우저의 고유한 특성들을 조합해서 일종의 "디지털 지문"을 만드는 기법이에요. 예를 들어 화면 해상도, 설치된 폰트, GPU 정보, 브라우저 플러그인 목록 같은 것들을 조합하면 꽤 높은 확률로 개별 사용자를 식별할 수 있거든요.
그런데 이번에 밝혀진 건 여기서 한 발 더 나간다는 거예요. Cloudflare 스크립트가 React의 내부 Fiber 트리에 접근해서 컴포넌트 상태값까지 읽고 있었다는 거죠. React Fiber는 React 16부터 도입된 내부 렌더링 엔진인데요, 쉽게 말하면 화면에 보이는 UI 요소들의 현재 상태와 구조를 담고 있는 내부 데이터 구조예요. 여기에 접근한다는 건 단순히 "이 페이지에 버튼이 있다" 수준이 아니라, "이 버튼이 지금 어떤 상태인지", "입력창에 어떤 값이 들어가 있는지"까지 볼 수 있다는 의미거든요.
왜 이렇게까지 하는 걸까
사실 OpenAI 입장에서는 나름의 이유가 있어요. ChatGPT는 API 호출 한 번에 실제 비용이 들어가는 서비스잖아요. 봇이 대량으로 요청을 보내면 비용도 문제지만 서비스 안정성에도 영향을 미치거든요. 그래서 Cloudflare의 고급 봇 탐지 시스템을 도입한 건데요.
Cloudflare Turnstile은 기존 CAPTCHA의 불편함 없이 봇을 걸러내겠다는 목표로 만들어졌어요. 사용자 경험을 해치지 않으면서도 정교하게 봇을 탐지하려다 보니, 수집하는 정보의 범위가 넓어진 거예요. 마우스 움직임 패턴, 키보드 입력 타이밍, 터치 이벤트의 압력값 같은 행동 기반 데이터부터, 앞서 말한 React 내부 상태까지 분석하는 거죠.
문제는 이 과정이 투명하지 않다는 거예요. 사용자에게 "지금 이런 정보를 수집하고 있어요"라고 알려주지 않고, 난독화된 코드 안에 숨겨져 있으니까요. 연구자가 코드를 복호화하지 않았으면 아무도 몰랐을 거예요.
프라이버시와 보안의 경계선
이 이슈는 웹 보안에서 늘 논쟁이 되는 지점을 정확히 건드려요. 봇 탐지는 분명 필요한데, 그 과정에서 어디까지 사용자 정보를 수집하는 게 적절한가 하는 문제요.
Google의 reCAPTCHA도 비슷한 논란이 있었어요. reCAPTCHA v3가 나왔을 때 "사용자 행동을 계속 추적한다"는 비판을 받았거든요. Cloudflare Turnstile은 reCAPTCHA의 프라이버시 문제를 해결하겠다고 나온 서비스였는데, 이번 분석을 보면 수집하는 데이터의 깊이가 오히려 더 깊은 측면도 있어요.
유럽의 GDPR이나 한국의 개인정보보호법 관점에서 보면, 이런 수집이 "정당한 이익"의 범위에 들어가는지도 따져봐야 해요. 봇 방지라는 목적이 있다고 해도, React 컴포넌트의 내부 상태까지 읽는 게 비례의 원칙에 맞는지는 논란이 될 수 있거든요.
한국 개발자에게 주는 시사점
프론트엔드 개발자라면 이번 사례에서 몇 가지 생각해볼 점이 있어요. 첫째, React의 Fiber 트리가 외부 스크립트에서 접근 가능하다는 점이에요. 여러분이 만든 React 앱에 서드파티 스크립트를 넣으면, 그 스크립트가 컴포넌트 내부 상태를 읽을 수도 있다는 뜻이거든요. 민감한 정보를 state에 평문으로 저장하고 있다면 한번 점검해볼 필요가 있어요.
둘째, Cloudflare나 AWS WAF 같은 CDN/보안 서비스를 도입할 때 정확히 어떤 클라이언트 사이드 스크립트가 실행되는지 파악하고 있어야 해요. 보안 서비스가 오히려 프라이버시 리스크가 될 수 있으니까요.
셋째, 자체 서비스에서 봇 탐지를 구현할 때 수집 범위를 명확히 정의하고, 개인정보 처리방침에 반영하는 것이 중요해요. 특히 한국은 개인정보보호위원회가 꽤 적극적으로 활동하고 있어서, 이런 부분에서 리스크가 생길 수 있거든요.
마무리
보이지 않는 곳에서 돌아가는 보안 스크립트가 생각보다 훨씬 많은 걸 보고 있었다는 이야기예요. 봇 탐지의 필요성은 인정하되, 그 방식이 투명해야 한다는 목소리가 커지고 있어요.
여러분이 운영하는 서비스에 서드파티 보안 스크립트를 쓰고 계신가요? 그 스크립트가 정확히 어떤 데이터를 수집하는지 확인해보신 적 있나요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공