이번 주 공개된 OpenAI 광고 픽셀 분석에서 쟁점은 쿠키가 이용자를 웹 곳곳에서 따라다닌다는 사실이 아니다. 그 쿠키가 어느 동의 항목 뒤에 놓여 있느냐다. Buchodi's Threat Intel이라는 이름으로 활동하는 연구자는 9월 20일, OpenAI가 로그인한 ChatGPT 계정에 묶인 식별자 __obi를 분석 쿠키로 분류해 두었다고 밝혔다. 그러나 관측된 이 식별자의 실제 역할은 해당 계정을 광고주 웹사이트로 실어 나르는 것이다. 분석에만 동의하고 마케팅을 거부한 이용자에게도 이 쿠키는 그대로 붙는다.
핵심 요약
- __obi는 OpenAI 쿠키 가운데 유일하게 SameSite=None으로 설정된다. 브라우저가 교차 사이트 요청에 쿠키를 붙이려면 반드시 필요한 플래그이며, .openai.com 도메인에서 1년간 유지된다.
- 연구자가 해독한 동기화 토큰 932건은 예외 없이 consent_decision: analytics_allowed 클레임을 담고 있었고, 그중 736건은 계정 주체(subject)를 명시했다.
- 쿠키와 함께 전송된 개인정보 대부분은 광고주가 의도적으로 넘긴 값이 아니라 광고주 페이지에서 긁어낸 값이었다. 685건 대 255건이다.
기술이 아니라 분류가 문제인 이유
교차 사이트 픽셀 자체는 흔하다. Meta는 로그인 계정, 픽셀 호출에 실려 다니는 서드파티 쿠키, 프로필로 되돌아와 정산되는 외부 전환이라는 세 재료를 이미 수년 전에 조합했다. 엔지니어링으로만 보면 OpenAI의 수집기는 평범한 애드테크다.
분류가 결정적인 이유는 따로 있다. OpenAI는 oai_consent_analytics와 oai_consent_marketing이라는 독립된 동의 스위치 두 개를 운영하는데, 쿠키 정책에서 분석 항목에 올라 있는 쿠키는 __obi 하나뿐이다. ePrivacy 규정을 본뜬 동의 체계에서는 쿠키가 실제로 수행하는 목적이 필요한 동의 수준을 결정한다. 사업자가 어느 항목에 적어 넣었는지는 기준이 아니다. 광고 식별자를 제3자 페이지 조회에 결합하는 것이 측정된 기능이라면, 서비스 성능을 파악하는 도구라고 방어하기는 어렵다.
세 단계로 이뤄지는 핸드셰이크
ChatGPT 클라이언트는 16바이트 난수를 생성해 /backend-api/bazaar/obi/sync-token에서 60초짜리 RS256 JSON 웹 토큰과 교환한다. 이 토큰의 클레임은 64자 계정 주체와 22자 식별자를 묶는다. 클라이언트는 이 토큰을 bzr.openai.com/v1/obi/sync로 교차 사이트 전송하고, 응답이 HttpOnly·Secure·SameSite=None 속성과 1년 만료로 __obi를 기록한다. 쿠키 값과 JWT의 식별자는 같은 문자열이다. 이후 OpenAI 픽셀이 심긴 페이지라면 어디서든 이 값이 다시 전송된다. OpenAI 내부 명명에서 bzr은 광고 플랫폼 자체를 가리키는 bazaar의 약자다.
SDK가 스스로 마련한 안전장치를 무력화하는 발견도 있다. 픽셀에는 자격 증명을 빼고 요청하는 코드 경로가 있지만, 브라우저는 SDK를 내려받는 <script src> 요청 단계에서 이미 쿠키를 붙여 보낸다. OpenAI 코드가 한 줄도 실행되기 전이다. 태그를 불러오는 것만으로 식별자가 노출되며, 광고주가 연동 방식을 어떻게 고르든 이 노출을 끌 수 없다는 뜻이다.
픽셀의 두 번째 임무: 호스트 페이지 읽기
OpenAI 페이로드는 신원 정보의 출처를 네 가지로 표시한다. 광고주가 의도적으로 넘긴 값은 in, SDK가 입력 폼·렌더링된 페이지 텍스트·태그 매니저 버스에서 가져온 값은 각각 fm·ht·js다. 마지막 경로가 가장 공격적이다. SDK는 window.dataLayer.push를 자기 함수로 바꿔치기하고, adobeDataLayer를 읽으며, gtm.js 태그의 l= 파라미터를 파싱해 이름이 바뀐 Google 태그 매니저 컨테이너까지 찾아낸다. 현재 빌드는 이 방식으로 이메일과 전화번호를 수집한다. 버전 0.1.31까지는 이름과 지역 정보도 함께 가져갔고, 8월 27일에야 범위가 좁혀졌다.
해싱은 절반만 적용된다. 이메일·전화번호·이름은 SHA-256으로 해싱되지만 국가·지역·도시·우편번호는 평문으로 전송된다. 그리고 우편번호는 28개 사이트에서 100건이 수집돼 단일 항목으로는 가장 많이 긁힌 폼 필드였다. 해싱된 식별자에 평문 우편번호가 더해지면 프라이버시 경계는 해싱만 놓고 볼 때보다 훨씬 약해진다. 전체 URL은 출처와 경로만 남기고 축약되며, 관측된 2만 3,929건 중 쿼리 문자열이 실린 사례는 없었다. 그러나 경로 자체가 내용을 충분히 드러내는 경우가 많다. 수집기에 도달한 경로 중에는 특정 질환명, 채무 해결 상담 단계, 소송 접수 양식이 있었다. 설정을 확인할 수 있었던 픽셀 881개 가운데 638개에서 자동 매칭이 켜져 있었고, 신용·대출 광고주는 예외 없이 여기에 포함됐다.
광고주가 이를 감사할 방법은 마땅치 않다. __obi는 광고주 스크립트가 읽을 수 없는 도메인에 있어, 태그를 심은 사업자는 자기 방문자가 어떤 신원 정보를 넘기고 있는지 들여다볼 수 없다. 웹 스크래핑 경로가 의도적 전달 경로를 세 배 가까이 앞지르는 만큼, 방문자에게 동의를 고지할 의무를 지는 쪽과 무엇을 수집할지 정하는 쪽이 서로 다른 경우가 빈번하다.
증거가 멈추는 지점
보고서는 스스로의 한계를 분명히 밝힌다. HTTP 202 응답은 수집기가 쿠키가 붙은 이벤트를 받아들였다는 사실만 보여줄 뿐, OpenAI가 그 이벤트를 자사 시스템에서 특정 계정으로 연결했다는 것까지 보여주지는 않는다. 연구자도 서버 측 결합은 관측한 사실이 아니라 설계에서 따라 나오는 추론이라고 설명한다.
도달 범위도 고르지 않다. 이 동작은 안드로이드용 Chrome에서 포착됐다. Safari는 서드파티 쿠키를 원천 차단하고 iOS의 Chrome은 WebKit으로 돌아가므로 iOS 브라우저에서는 이 메커니즘이 작동하지 않으며, 데스크톱 Chrome은 검증되지 않았다. 동기화 토큰이 실제로 발급된 ChatGPT 세션은 다섯 번에 한 번꼴이었다. 결국 노출은 고르게 퍼지기보다 안드로이드 이용자에게 집중되고, 측정된 확산 규모는 전체를 담은 수치가 아니라 하한선으로 읽어야 한다.
트래픽이 분명히 입증하는 것은 지속성이다. 연구자 본인의 단말에서는 __obi 값 하나가 13개 픽셀 ID를 통해 12개 상업 사이트에서 OpenAI로 전송됐다. Chewy, Wayfair, ThriftBooks, Eventbrite, HelloFresh, Coursera, SeatGeek 등이 포함됐다. 더 넓은 수집 구간에서는 서로 다른 값 30개 중 12개가 둘 이상의 광고주에서 나타났고, 그중 하나는 열 곳에서 관측됐다. 로그아웃도 탈출구가 아니다. 토큰 196건은 익명 주체를 담고 있었는데, 이 값은 최소 27일 동안 같은 기기에 고정돼 있었다.
다음 국면
연구자는 OpenAI에 직접 물었다. 9월 14일 press@openai.com과 privacy@openai.com으로 두 가지 질문을 보냈다. 왜 이 쿠키를 분석으로 분류했는지, 그리고 마케팅 동의를 거부하면 수집이 멈추는지였다. 돌아온 것은 지적한 내용을 내부에 공유하겠다는 OpenAI 지원팀의 회신뿐이었다. 두 질문 어느 쪽에도 답은 없었다.
그 침묵은 OpenAI가 이 픽셀이 떠받치는 사업을 키우는 속도와 나란히 놓고 보면 더 어색해진다. ChatGPT 안에서 판매 대화를 이어가는 스폰서 에이전트부터 자동 매칭 스위치가 놓인 Ads Manager 콘솔까지가 모두 그 사업이다. 불편한 지점은 사람들이 AI 어시스턴트에게 털어놓는 내용과 공개적으로 올리는 내용이 전혀 다르다는 데 있다. 이 분석 글이 하루 만에 Hacker News에서 379점과 댓글 188개를 얻은 것을 보면 개발자들은 그 차이를 곧바로 알아챈 듯하다. 가장 먼저 풀릴 실마리는 동의 분류일 가능성이 높다. 기업의 공식 설명과 실측 결과가 정면으로 어긋나는 유일한 지점이기 때문이다.
자주 묻는 질문
ChatGPT 이용자가 __obi 쿠키를 끌 수 있나
보고서는 이를 비활성화하는 설정을 찾지 못했다. OpenAI가 이 쿠키를 분석으로 취급하므로 마케팅 동의를 거부해도 멈추지 않는다. .openai.com에서 1년간 유지되며, 쿠키를 삭제하면 다음 동기화 전까지는 사라진다. 서드파티 쿠키를 차단하는 브라우저, 즉 Safari와 iOS의 모든 브라우저에서는 교차 사이트 단계 자체가 성립하지 않는다.
광고주는 자기 방문자에게 붙은 ChatGPT 신원을 볼 수 있나
볼 수 없고, 그것이 문제의 일부다. __obi는 광고주 스크립트가 읽을 수 없는 도메인에 있어 태그를 심은 사업자도 감사할 수 없다. 픽셀이 쓰는 또 다른 쿠키 __obref는 광고주 자체 도메인에 기록되며 사이트마다 고유한 값을 유지한다. 관측된 값 2,860개 중 2,828개가 정확히 한 광고주에서만 나타났다.
OpenAI가 웹 이용 기록을 실명 계정과 연결한다는 것이 입증됐나
단정할 수는 없다. 계정 결합은 JWT 클레임 안에서 확인되고, 식별자가 OpenAI로 전송돼 수용되는 것도 실제로 관측됐다. 다만 최종 연결 단계는 OpenAI 서버에서 이뤄지고 연구자는 그 부분을 볼 수 없었다. 이 대목은 측정이 아니라 구조에서 추론한 것이다.






