Hacker News

ChatGPT now knows what you do on other websites via ad collector

광고 수집기를 통해 다른 웹사이트에서 무엇을 하는지 알게 된 ChatGPT

OpenAI의 광고 수집기가 ChatGPT 계정과 연결된 식별자 쿠키를 광고주 웹사이트로 전송해 사용자의 탐색·구매 관련 정보를 수집한다는 분석입니다. 이 쿠키는 로그아웃 상태에서도 작동하며, 분석 동의만 한 사용자에게도 전달될 수 있어 ChatGPT의 광고 사업과 개인정보 보호 범위를 함께 보여줍니다.

AI 요약

이 글은 OpenAI가 ChatGPT와 광고주 웹사이트 사이에서 사용하는 광고 수집기(ad collector)의 동작을 분석합니다. 핵심은 ChatGPT에서 생성된 __obi 쿠키가 사용자의 ChatGPT 계정 또는 익명 세션과 연결된 뒤, OpenAI 광고를 게재하는 다른 웹사이트를 방문할 때 다시 OpenAI로 전송된다는 점입니다. 따라서 OpenAI는 사용자가 광고주 사이트에서 어떤 상품을 찾았는지, 어떤 글을 읽었는지, 구매 절차를 진행했는지와 같은 활동을 ChatGPT 측 식별자와 결합할 수 있는 구조를 갖게 됩니다.

■ 식별자 생성과 쿠키 설정 절차

ChatGPT 웹 클라이언트는 16바이트 난수를 생성한 뒤 /backend-api/bazaar/obi/sync-token 또는 로그아웃 상태에서 /backend-anon/ 엔드포인트를 호출합니다. 서버는 RS256 JWT(JSON Web Token)를 반환하며, 토큰에는 발급자와 대상인 bzr.openai.com, obi 식별자, 계정 주체인 sub, 동의 결정값 consent_decision, 그리고 60초 뒤 만료되는 exp가 포함됩니다. 로그인 상태에서는 subject_type이 account_user로 표시되고, 로그아웃 상태에서는 anonymous로 표시됩니다.

클라이언트는 이 토큰을 bzr.openai.com/v1/obi/sync로 전송하고, OpenAI는 Domain=.openai.com 범위의 __obi 쿠키를 설정합니다. 이 쿠키의 Max-Age는 31,536,000초로 1년이며, HttpOnly와 Secure가 적용되고 SameSite=None으로 설정됩니다. 특히 SameSite=None은 교차 사이트 요청에도 쿠키가 전송될 수 있도록 하는 설정입니다. 글의 분석에 따르면 JWT 안의 obi 값과 쿠키 값은 동일하며, 이 식별자는 OpenAI 광고 수집기와 ChatGPT 측 주체를 연결하는 역할을 합니다.

■ 광고주 웹사이트에서 쿠키가 전송되는 방식

광고주 사이트에 설치된 OpenAI SDK는 세 가지 유형의 요청을 OpenAI 호스트로 보냅니다. SDK 스크립트 자체를 불러오는 GET 요청, 전환 이벤트를 보내는 POST 요청, 그리고 별도의 인증 정보 없이 이벤트를 보내는 POST 요청입니다. 분석자는 Android의 Chrome에서 세 요청 모두 __obi가 포함되는 것을 확인했다고 설명합니다. 반면 pixel-config 요청에는 쿠키가 전혀 포함되지 않아 대조군 역할을 했습니다.

가장 중요한 지점은 SDK가 자체 코드에서 credentials를 제외하더라도 쿠키가 이미 노출될 수 있다는 점입니다. 브라우저는 OpenAI의 자바스크립트가 실행되기 전에 script src를 통해 SDK 파일을 요청하고, 이 요청에 __obi를 자동으로 붙입니다. 따라서 광고주 페이지에 해당 태그를 삽입하는 것만으로도 식별자가 OpenAI로 전달될 수 있습니다.

■ 페이지에서 함께 수집되는 정보

SDK는 쿠키뿐 아니라 광고주 페이지에서 수집한 정보도 이벤트 payload에 포함합니다. 글은 OpenAI가 값을 네 가지 출처로 구분한다고 설명합니다. 광고주가 의도적으로 전달하는 in 값과, 폼 필드에서 읽은 값인 fm, 렌더링된 페이지 텍스트에서 읽은 값인 ht, 태그 관리자(tag manager) 버스에서 읽은 값인 js입니다. 관찰된 이벤트에서는 광고주가 직접 제공한 식별 정보보다 SDK가 페이지에서 긁어낸 식별 정보가 더 많았으며, 각각 255건과 685건이었습니다.

태그 관리자 버스는 이메일 주소가 가장 많이 유입된 경로였습니다. SDK는 window.dataLayer.push를 자체 함수로 대체하고 adobeDataLayer도 읽습니다. 또한 gtm.js 스크립트 태그의 l 파라미터를 분석해 이름이 바뀐 GTM 레이어도 찾습니다. 현재 버전은 이 경로를 통해 이메일과 전화번호를 수집하며, 0.1.31 버전은 범위가 8월 27일에 축소되기 전까지 이름과 지역 정보도 수집했습니다.

이메일, 전화번호, 이름은 전송 전에 SHA-256으로 해시됩니다. 반면 국가, 주·지역, 도시, 우편번호는 평문으로 전송됩니다. 관찰된 폼 필드 중에서는 우편번호가 가장 자주 수집됐으며, 28개 사이트에서 100건의 이벤트가 확인됐습니다. URL은 출처(origin)와 경로(path)만 남기도록 축약됐고, 관찰된 23,929건에는 쿼리 문자열이 포함되지 않았습니다. 그러나 경로 자체는 남기 때문에 의료 질환, 부채 해결 상담, 소송 접수 양식으로 이어지는 경로가 수집기에 도달한 사례가 있었습니다.

■ 자동 매칭과 도달 범위

자동 매칭은 설정이 확인된 881개 픽셀 중 638개에서 활성화되어 있었습니다. 관찰된 신용·대출 광고주는 모두 자동 매칭이 켜져 있었습니다. 이 기능은 OpenAI의 Ads Manager에서 제어됩니다. 비밀번호, 일회용 코드, 카드 번호, 사회보장번호(SSN), 생년월일, 병력, 진단 정보, 법원 관련 필드는 거부 목록(denylist)으로 제외됩니다. 다만 페이지 경로와 다른 수집 항목이 결합될 수 있다는 점은 별도로 관찰됐습니다.

분석자의 기기에서는 하나의 __obi 값이 Chewy, Wayfair, ThriftBooks, Eventbrite, HelloFresh, Coursera, SeatGeek 등을 포함한 12개 상업 웹사이트와 13개의 서로 다른 픽셀 ID에서 OpenAI로 전송됐습니다. 각 요청은 HTTP 상태 코드 202로 수락됐습니다. 더 넓은 트래픽에서는 30개의 서로 다른 __obi 값 중 12개가 둘 이상의 광고주 아래에서 나타났고, 그중 하나는 10개 광고주에서 발견됐습니다.

로그아웃 상태도 완전히 제외되지 않습니다. 해독된 동기화 토큰 932개 중 736개는 account_user였고 196개는 anonymous였습니다. 글은 익명 주체의 식별자도 계정 주체와 마찬가지로 안정적이며, 하나의 기기에서 최소 27일 동안 유지됐다고 설명합니다. 다만 실제로 OpenAI가 수집된 이벤트를 서버 측에서 계정과 결합하는 순간을 직접 관찰한 것은 아니며, 쿠키가 붙은 이벤트가 수집기에 의해 202로 수락된 것까지 확인했다고 한정합니다.

■ 동의 설정과 브라우저 제약

OpenAI의 쿠키 정책은 __obi를 chatgpt.com과 openai.com에서 1년 동안 유지되는 분석(analytics) 쿠키로 분류합니다. 이 정책의 분석 쿠키 항목에는 __obi만 포함되어 있습니다. OpenAI는 분석 동의와 마케팅 동의를 oai_consent_analytics 및 oai_consent_marketing이라는 별도 선택지로 운영하지만, 분석자가 해독한 모든 동기화 토큰에는 analytics_allowed가 들어 있었습니다. 따라서 글은 마케팅에는 동의하지 않고 분석에만 동의한 경우에도 이 쿠키가 설정될 가능성을 문제로 제시합니다.

브라우저 동작상 다른 OpenAI 쿠키인 oai-did와 oaicom-stable-id는 SameSite=Lax라 광고주 페이지 요청에서 차단됐고, 세션 쿠키는 도메인 불일치로 전송되지 않았습니다. __obi만 SameSite=None으로 설정되어 교차 사이트 전송이 가능했습니다. 관찰은 Android의 Chrome에서 수행됐습니다. Safari의 Intelligent Tracking Prevention은 모든 서드파티 쿠키를 차단하며, iOS의 Chrome은 WebKit을 사용하므로 iOS 브라우저에서는 이 메커니즘이 작동하지 않는다고 설명합니다. 데스크톱 Chrome은 테스트하지 않았습니다. 또한 ChatGPT 세션의 약 5분의 1에서만 동기화 토큰이 생성됐고, 모바일 웹 클라이언트는 광고를 제공하면서도 동기화를 수행하지 않는 경우가 있었습니다.

■ OpenAI의 답변과 광고 기술의 맥락

분석자는 9월 14일 OpenAI의 언론·개인정보 보호 주소로 __obi가 왜 분석 쿠키로 분류되는지, 분석 동의와 마케팅 거부를 함께 선택한 사용자에게도 쿠키가 발급되는지를 문의했습니다. OpenAI Support는 문의를 확인하고 관찰 내용을 내부 검토에 공유하겠다고 답했지만, 두 질문에 대한 직접적인 답변은 제공하지 않았습니다.

글은 이 구조가 Facebook이나 Google이 오래전부터 사용해 온 광고 기술과 구조적으로 유사하다고 설명합니다. 로그인 계정, 픽셀 요청에 포함되는 서드파티 쿠키, 외부 사이트의 전환 이벤트를 프로필에 연결하는 방식 자체는 기존 광고 기술의 패턴입니다. 다만 ChatGPT 같은 AI 대화 서비스에 적용된다는 점이 차이로 제시됩니다. 사용자가 소셜 네트워크보다 더 민감하다고 느낄 수 있는 내용을 AI 서비스에 입력할 수 있고, 이러한 서비스가 사용자를 대신해 행동하는 방향으로 확장되고 있다는 점에서 개인정보 보호 범위가 중요해진다는 설명입니다. 한편 광고주 도메인에 설정되는 __obref는 사이트마다 다른 값이고 다른 광고주가 볼 수 없으며, 관찰된 2,860개 값 중 2,828개는 정확히 하나의 광고주에서만 나타났습니다. 광고주가 자신들의 전환 픽셀을 통해 방문자가 ChatGPT 식별자와 연결되고 있다는 사실을 알 수 있는 구조도 아니라고 합니다.

■ Hacker News 반응

• @Legend2440 — 그러니까 기본적으로 Facebook, Google 등이 수십 년 동안 해오던 것과 같은 종류의 추적 아닌가요?

• @emptybits — 비슷합니다. 하지만 일반적인 무료 서비스의 Google과 Facebook 사용자와 달리, 어떤 사람들은 OpenAI가 이 사업 모델에 참여하도록 돈을 내고 있습니다.

• @troupo — 경멸적인 표현인 무임승차 사용자입니다. 무임승차 사용자는 돈을 내는 사용자와 동일한 개인정보 보호를 받아야 합니다.

• @rangestransform — 정부가 OpenAI에 광고 없는 무료 요금제를 운영하도록 돈을 지불하게 될까요?

• @upboundspiral — 정부는 광고가 대규모 감시와 스토킹이 되는 것을 막는 법을 통과시킬 수 있습니다.

원문: Buchodi / 번역·요약: Trawling