PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

ChatGPTの「広告用クッキー」が、他サイトの行動をつなげてしまう話

ChatGPTを使っているだけなのに、その識別子が広告経由で別サイトの行動と結びつく――元記事は、そんな仕組みがOpenAIの広告基盤で動いていると指摘している。話が重いのは、対象がふつうの広告ネットワークではなく、会話の中に個人的な相談が集まりやすいChatGPTだからだ。しかも、ユーザーがログアウトしていても動くとされる。広告計測は珍しくないが、生成AIサービスの中で同じ発想がそのまま使われると、見え方はかなり変わる。

OpenAIの広告用識別子「__obi」は、ChatGPTと外部サイトをまたいで届くのか

元記事が中心に扱っているのは、OpenAIの広告集計用の仕組みだ。著者によれば、bzr.openai.com のコレクターが __obi というCookieをセットし、その値は openai.com ドメインに紐づけられる。まずChatGPT側で、この識別子がアカウントに結びついた状態で作られる。著者が確認した流れでは、chatgpt.com 上のクライアントが16バイトの乱数を作り、POST /backend-api/bazaar/obi/sync-token あるいはログアウト時の /backend-anon/ に送る。するとバックエンドはRS256のJWTを返し、その中に subobi が入り、exp は60秒後になっている。sub はアカウント、obi は識別子で、両者を結びつけた短命のトークンだという説明だ。

そのトークンは次に bzr.openai.com/v1/obi/sync へクロスサイトで送られ、そこで Set-Cookie: __obi=...; Domain=.openai.com; HttpOnly; Max-Age=31536000; Path=/; SameSite=none; Secure が返る。ここで重要なのは SameSite=NoneSecure の組み合わせで、これによりブラウザが別サイトからのリクエストにもCookieを載せられる点だ。著者は、実際に自分の端末で再現し、2つの独立したキャプチャ手法でも確認したうえで、936個の広告ピクセル、1,029のホスト名にまたがる数か月分の通信を照合したとしている。

さらに問題なのは、広告主のサイトに埋め込まれたOpenAIのSDKが、その __obi を外部へ戻してしまうことだ。元記事では、広告主サイトからOpenAI側へ送られる通信として、bzrcdn.openai.com/sdk/oaiq.min.js の読み込み、bzr.openai.com/v1/sdk/events へのイベント送信などが挙げられている。著者の端末では、__obi が入っていたCookie jarがあると、これらの通信にCookieが付いた。とくに、<script src> でSDKを読み込む段階でCookieが送られてしまうため、OpenAIのコードが動く前に識別子が露出する、と指摘している。

SDKはページ側の情報も拾う。元記事によると、OpenAI自身が in fm ht js とラベル付けした4系統があり、広告主が明示的に渡す値だけでなく、フォーム入力、ページ本文、タグマネージャーのデータ層からも情報を集める。観測された通信では、スクレイピングされた情報のほうが、広告主が渡した情報より多かった。メールアドレスや電話番号はSHA-256でハッシュ化される一方、国・地域・都市・郵便番号は平文で送られ、URLはクエリなしで origin と path までに短縮される。元記事は、医療、債務整理、訴訟相談のフォーム名まで含まれていたと書いている。Cookieポリシー上は __obi は「Analytics cookies」に分類され、保存期間は1年。OpenAIは分析用と広告用の同意を分けているが、著者が復号した同期トークンはすべて consent_decision: analytics_allowed だったとしている。

観測範囲では、1つの __obi 値がChewy、Wayfair、ThriftBooks、Eventbrite、HelloFresh、Coursera、SeatGeekなど12の商用サイトからOpenAIへ送られたという。なお、著者はiPhone系ではこの仕組みは動かず、Chrome for Androidで見えたと説明している。SafariのITPやiOSのWebKit制約があるためだ。広告主側からは、これはOpenAIのドメインにあるCookieなので見えない。つまり、サイト運営者は自分の広告ピクセルがChatGPTアカウントとつながっていることに気づきにくい、というのが元記事の骨子だ。

「広告計測です」で済ませるには、ChatGPTはあまりに個人的すぎる

まず引っかかるのは、ここで起きていること自体は、技術的には珍しくない点だと思う。著者もMetaの構造に似ていると書いているし、広告の世界では、ログイン済みの識別子、第三者の埋め込みコード、オフサイトのコンバージョン計測は昔からある。だから問題は「そんなことができるのか」ではない。むしろ、「それをChatGPTでやるのか」という感覚のほうが大きい。生成AIのチャット画面は、SNSよりも相談内容が内向きになりやすい。買い物の比較、健康の不安、仕事の愚痴、誰にも見せたくない前提条件。そこに広告計測の発想をそのまま重ねると、ユーザーの心理的な距離感と実装の距離感がずれる。私は、このずれがいちばん不安を呼ぶと思う。

形式上は「Analytics」でも、実際には広告のための結線に見える

元記事で気になったのは、__obi がCookieポリシー上「Analytics cookies」に置かれていることだ。分析用Cookieという説明は、サービス改善の文脈では確かにありがちだが、著者が示した通信内容を見ると、外部サイトでの行動をChatGPTアカウントに戻す役割がかなり前面に出ている。しかも、広告主サイトのSDKがフォームやページ本文まで拾うなら、それは単なる閲覧統計ではない。もちろん、OpenAI側には「分析」と「広告」を分けた同意設計があるのだろう。ただ、実装が実質的に広告計測なら、利用者はその言葉を額面通りには受け取りにくい。私は、ここは法務や規約の話というより、ラベルの付け方がユーザーの理解を追い越しているように見える。

「ログアウトしていても動く」は、安心材料ではなく別の懸念になる

元記事では、ログアウト状態でも anonymous の同期トークンが作られ、しかも端末単位で安定しているとされていた。これは一見すると「アカウントに結びつかないなら問題が小さい」と読めるかもしれない。だが実際には、その匿名識別子も同じ端末に長く残り、少なくとも27日持つと書かれている。つまり、アカウントにつながるかどうか以前に、端末の行動が継続的に束ねられる。ログアウトしているから追跡されない、という理解はここでは成立しにくい。しかも、ログアウト時のデータはユーザーの感覚としては「まだ個人化されていない」はずなのに、広告側の仕組みはすでに個別識別のために動いている。このズレは、同意画面の言い回しだけでは埋まらないと思う。

一番まずいのは、利用者より先に広告主まで見えなくなること

この話はプライバシーの論点だけでなく、広告主との関係も少し変えてしまう。元記事によれば、__obi は広告主のドメインにあるCookieではなく、広告主側のスクリプトから読めない場所にある。だから広告主は、自分のピクセルがどのChatGPTアカウントに結びついたのかを直接知れない。外から見ると、成果計測のための通常の埋め込みコードなのに、裏ではOpenAIが独自に名寄せしている。これは、広告主にとっても利用者にとっても、見えているはずのない接続が発生している状態だ。私は、この非対称性がかなり厄介だと思う。ユーザーは知らない、広告主も完全には見えない、でも基盤を持つ側だけが全体像を握る。そういう構造は、いったん運用が始まると止めにくい。

生成AIの本業と広告の本業が、同じブラウザの中で衝突している

OpenAIが広告を扱うこと自体は、今のインターネットでは不自然ではない。だが、ChatGPTは普通の広告面と違い、会話の中身がそのまま価値になるサービスだ。そこに外部サイトの閲覧や購入傾向を結びつけると、ユーザーは「会話」と「行動履歴」が同じ企業の手の中に入ることになる。元記事は、これはMetaがすでにやってきた構造だと言う。たしかに仕組みだけ見ればそうだろう。ただ、生成AIは検索やSNSよりも、相談の密度が高い。だから私は、この手の実装が広がるほど、「何を入力するか」より「どこと結ばれるか」を意識して使う時代になっていくのではないかと思う。便利さの裏側で見えにくくなっているのは、広告そのものではなく、会話の居場所なのかもしれない。


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

同じ著者の記事