메뉴
HN
Hacker News • 5일 전

ChatGPT가 광고 수집기를 통해 다른 웹사이트 활동까지 추적

IMP
8/10
핵심 요약

OpenAI가 bzr.openai.com이라는 광고 수집기를 통해 ChatGPT 계정과 연결된 __obi 쿠키를 발급하고, ChatGPT에 광고를 게재하는 광고주 사이트에 설치된 SDK가 이 식별자와 페이지 데이터를 OpenAI로 전송하는 것이 확인되었습니다. SDK는 이메일·전화번호뿐 아니라 양식 필드와 태그매니저 데이터레이어에서 이름, 지역 정보까지 긁어가며, 스크래핑된 신원 정보가 광고주가 의도적으로 넘긴 정보보다 더 많았습니다. 개인정보·추적 관점에서 매우 중요한 이슈입니다.

번역된 본문

OpenAI의 광고 수집기 bzr.openai.com은 .openai.com 범위로 지정된 __obi라는 쿠키를 설정합니다. 이 값은 ChatGPT 사용 중 생성되며 ChatGPT 계정에 연결됩니다. __obi는 이후 사용자가 방문하는 일반 웹사이트에서 OpenAI로 전송됩니다. ChatGPT에 광고를 구매하는 기업은 자사 사이트에 OpenAI 코드를 삽입하는데, 이는 소매업체들이 이미 Meta와 Google 추적 코드를 삽입하는 방식과 동일합니다. 해당 코드가 로드되면 __obi가 사용자가 보고 있는 페이지에 관한 데이터와 함께 OpenAI로 전송됩니다. 여기에는 검색 중인 상품, 읽고 있는 기사, 구매 행동이 포함됩니다. 결국 OpenAI는 사용자가 그 사이트들에서 하는 일을 ChatGPT 계정과 연결할 수 있습니다. 필자는 자신의 휴대폰에서 전체 메커니즘을 재현했고, 두 가지 독립적인 캡처 방법으로 검증했으며, 1,029개 호스트네임에 걸친 936개의 서로 다른 광고주 픽셀을 포함해 수개월간 관측된 트래픽과 교차 확인했습니다.

작동 방식

1단계. ChatGPT가 식별자를 생성하고 서명합니다. chatgpt.com에서 클라이언트는 16바이트 난수를 생성하고 POST /backend-api/bazaar/obi/sync-token(로그아웃 상태에서는 /backend-anon/)을 호출합니다. 백엔드는 RS256 JWT를 반환합니다: { "iss": "chatgpt-wadi", "aud": "bzr.openai.com", "purpose": "obi_sync", "operation": "set", "consent_decision": "analytics_allowed", "consent_policy_version": "user_granular_consent_v1", "sub": "«편집됨: 64자리 16진수 계정 subject»", "subject_type": "account_user", "obi": "«편집됨: 22자 식별자»", "exp": "«iat + 60초»" }. sub가 계정이고 obi가 식별자입니다. 토큰은 둘을 묶고, 수집기로 범위가 제한되며, 60초 후 만료됩니다. bzr은 bazaar, 즉 OpenAI의 광고 플랫폼 내부 명칭이고, wadi는 발급 서비스입니다.

2단계. 식별자가 OpenAI 도메인의 쿠키가 됩니다. 클라이언트는 {"token": "«JWT»"}를 크로스사이트로 bzr.openai.com/v1/obi/sync에 POST합니다. 응답은: Set-Cookie: __obi=«편집됨»; Domain=.openai.com; HttpOnly; Max-Age=31536000; Path=/; SameSite=none; Secure. Secure와 함께 SameSite=none은 쿠키가 크로스사이트 요청에 전송되기 위해 필요한 설정입니다. Max-Age는 1년입니다. JWT의 obi 값과 쿠키의 값은 동일합니다.

3단계. 광고주 사이트가 이를 다시 전송합니다. 광고주 페이지에서 OpenAI 호스트로 세 종류의 요청이 나갑니다. __obi가 쿠키 저장소에 있는 휴대폰에서는 세 가지 모두 이를 실어 보냤습니다:

요청 | __obi 포함 | 비고 GET bzrcdn.openai.com/sdk/oaiq.min.js | 예 | 스크립트 로드 자체 POST bzr.openai.com/v1/sdk/events (obref 포함) | 예 | 전환 이벤트 POST bzr.openai.com/v1/sdk/events (본문만) | 예 | SDK의 "자격증명 없음" 경로 GET bzrcdn.openai.com/pixel-config/… | 아니오 | 쿠키 헤더 없음(대조군)

첫 번째 행이 특히 흥미롭습니다. 픽셀 SDK에는 자격증명을 생략하는 코드 경로가 있지만 소용없습니다. 브라우저가 OpenAI 코드가 실행되기 전에 SDK를 로드하는