채널 동향2026-09-21

광고주가 건넨 것보다 픽셀이 긁어 간 쪽이 많았다

685 대 255, ChatGPT 광고 픽셀 해부

ChatGPT 광고를 산 사이트가 심는 코드가 방문자 폼 입력을 읽어 OpenAI로 보낸다. 자동 매칭은 설정이 확인된 픽셀 881개 중 638개에서 켜져 있었다. 광고주는 그 쿠키를 읽을 수 없다.

광고 픽셀을 붙이는 쪽은 플랫폼이 아니라 광고주다. Meta도 Google도 그랬고 ChatGPT 광고도 같다. 코드 한 줄을 내 사이트에 심으면 그때부터 전환이 집계된다. 여기까지는 십 년 된 이야기다.

한 보안 연구자가 9월 20일 그 코드가 실제로 무엇을 보내는지 자기 기기에서 재현해 공개했다. 독립 캡처 두 가지로 검증했고 광고주 픽셀 936개와 호스트네임 1,029개를 몇 달간 관측한 기록과 대조했다. 숫자 하나가 눈에 걸린다. 광고주가 의도적으로 넘긴 신원 정보는 255건, 픽셀이 페이지에서 직접 긁어 간 신원 정보는 685건이었다.

한 줄 정리

ChatGPT 광고 픽셀이 광고주 페이지의 폼 입력과 태그 매니저 버스를 스스로 읽어 OpenAI로 보내고 같은 요청에 실린 쿠키가 그 행동을 방문자의 ChatGPT 계정에 붙인다.

한눈에 보기

항목 관측값
스크레이프 신원 vs 광고주 제공 685건 : 255건
자동 매칭 켜진 픽셀 설정 확인 881개 중 638개
가장 많이 수집된 폼 필드 우편번호, 28개 사이트 100건
해시 없이 평문 전송 국가·지역·도시·우편번호
로그인 계정에 묶인 비율 동기화 토큰 932개 중 736개
쿼리스트링 포함 URL 관측 23,929건 중 0건

쿠키 하나만 벽을 넘는다

OpenAI 수집기는 __obi라는 쿠키를 .openai.com 도메인에 심는다. 유효기간 1년, SameSite=None, Secure. 이 조합이 교차 사이트 요청에 쿠키를 실어 보내는 설정이다.

같은 광고주 페이지에서 다른 OpenAI 쿠키들은 전부 브라우저에 막혔다. 세션 쿠키는 도메인이 안 맞아서, 기기 식별 쿠키는 SameSite=Lax라서. SameSite=None으로 설정된 OpenAI 식별자는 __obi 하나뿐이다.

더 눈여겨볼 지점은 회피가 안 된다는 사실이다. 픽셀 SDK에는 자격 증명을 빼고 요청하는 코드 경로가 있다. 그 경로가 실행되기 전에 이미 브라우저가 <script src> 로드 요청에 쿠키를 붙인다. 태그를 불러오는 행위 자체로 식별자가 넘어간다.

페이지에서 무엇을 읽어 가나

SDK가 보내는 값은 출처별로 네 갈래로 표시된다. 광고주가 일부러 넘긴 값, 폼 필드에서 읽은 값, 렌더된 페이지 텍스트에서 읽은 값, 태그 매니저 버스에서 읽은 값. 이메일이 가장 많이 나온 곳은 태그 매니저 쪽이었다. SDK는 window.dataLayer.push를 자기 함수로 바꿔 놓고 adobeDataLayer도 읽는다. 이름이 바뀐 GTM 레이어는 스크립트 태그의 l= 파라미터를 파싱해 찾아낸다.

이메일·전화·성·이름은 SHA-256으로 해시해서 보낸다. 국가·지역·도시·우편번호는 평문이다. 0.1.31 버전까지는 이름과 지리 정보도 태그 매니저에서 가져갔고 8월 27일에 범위가 좁혀졌다.

URL은 오리진과 경로만 남기고 잘려 나간다. 관측된 23,929건 중 쿼리스트링이 실린 요청은 없었다. 다만 경로는 그대로 간다. 수집기에 도착한 경로 중에는 특정 질환명, 채무 해결 퍼널, 소송 접수 폼이 있었다. 비밀번호·일회용 코드·카드번호·주민식별번호·생년월일·진단명은 차단 목록에 올라 있다.

로그아웃해도 끊기지 않는다

식별자가 만들어지는 과정은 이렇다. ChatGPT 클라이언트가 무작위 16바이트를 만들어 백엔드에 동기화 토큰을 요청하면 RS256 서명 JWT가 돌아온다. 그 토큰 안에 계정 주체와 식별자가 함께 묶여 있고 수명은 60초다. 클라이언트가 그 토큰을 수집기에 보내면 수집기가 같은 값을 쿠키로 내려 준다.

토큰에 적히는 주체 종류가 두 가지다. 해독된 동기화 토큰 932개 중 736개는 계정 사용자였고 196개는 익명이었다. 그런데 익명 주체도 계정 주체만큼 안정적이다. 기기당 하나가 붙고 최소 27일 유지된다. 로그인을 안 했다고 추적이 끊기는 구조가 아니다.

헷갈리기 쉬운 쿠키가 하나 더 있다. 픽셀은 광고주 자기 도메인에도 쿠키를 심는데 이쪽은 사이트마다 값이 다르다. 관측된 값 2,860개 중 2,828개가 정확히 한 광고주 아래에서만 나타났다. 사이트를 가로지르는 쪽은 OpenAI 도메인 쿠키 하나뿐이다.

광고주도 자기가 뭘 넘기는지 못 본다

__obi는 광고주 도메인이 아니라 OpenAI 도메인의 쿠키다. 광고주 사이트의 스크립트는 그 값을 읽을 수 없다. 전환 픽셀을 달았을 뿐인 쇼핑몰은 자기 방문자가 어떤 ChatGPT 계정으로 해석되는지 확인할 방법이 없다.

범위를 정직하게 좁혀 둘 대목도 있다. 이 동작은 안드로이드 크롬에서 관측됐다. 사파리는 서드파티 쿠키를 전부 막고 iOS 크롬도 WebKit 위에서 돌아서 iOS 브라우저에서는 작동하지 않는다. ChatGPT 세션 다섯 번 중 한 번 정도만 동기화 토큰이 생겼다. 서버가 그 이벤트를 실제로 계정에 결합하는 장면은 직접 관측되지 않았고, 설계상 그렇게 된다는 추론이다.

OpenAI 쿠키 정책은 __obi를 분석용 쿠키로, 기간 1년으로 적어 뒀다. 그 항목은 해당 절의 유일한 항목이다. 연구자는 9월 14일 OpenAI에 두 가지를 물었다. 왜 분석용으로 분류했는지, 그리고 분석에는 동의하고 마케팅에는 동의하지 않은 사용자에게도 이 쿠키가 가는지. 답은 오지 않았다.

위시클레이 관점

구조 자체는 새롭지 않다. 로그인 계정, 픽셀에 실리는 서드파티 쿠키, 계정으로 해석되는 사이트 밖 전환. Meta가 몇 년 전에 세운 그대로다. 새로운 것은 그 배관이 붙은 자리다. 사람들은 챗 제품에 소셜에는 절대 안 쓰는 이야기를 한다.

콘텐츠·커머스 쪽 작은 팀에게 걸리는 지점은 따로 있다. 자동 매칭을 켠 픽셀이 881개 중 638개였다는 숫자는 이 기능이 기본값에 가깝게 굴러간다는 뜻이다. 그리고 그 스위치는 OpenAI 광고 관리자 안에 있다. 즉 전환 추적을 켠 사람과 폼 스크레이핑에 동의한 사람이 같은 사람인데, 두 결정을 따로 내린 기억이 없는 상태다.

우편번호가 최다 수집 필드였다는 점이 실무적으로 제일 아프다. 주소 입력창은 한국 쇼핑몰이라면 없는 곳이 없고, 개인정보 취급방침에 제3자 제공을 적어 둔 곳은 드물다. 광고 성과를 재려고 붙인 코드가 개인정보 이전 경로가 됐고 그걸 붙인 당사자는 확인할 수단이 없다.

그래서 이번 주에 할 일은 관리자 화면 하나다. 광고 관리자에서 자동 매칭 설정이 어디 있는지 찾아 현재 값을 확인한다. 켜 둘 거면 개인정보 처리방침에 한 줄을 넣는다. 태그 매니저를 쓴다면 dataLayer에 이메일과 전화가 들어가는지도 같이 본다. 십오 분이면 끝나는 점검인데 안 하면 남이 대신 찾아낸다.

플랫폼이 준 배관은 공짜로 편하고, 나중에 값이 청구된다. 이번엔 돈이 아니라 우리가 보관한다고 약속한 고객 데이터로.

참고