# 独立调查：ChatGPT 的 __obi 跨站 Cookie 可将站外浏览行为关联到 ChatGPT 账号

- 来源：Hacker News 热门（buzzing.cc 中文翻译）
- 作者：lmbbuchodi
- 发布时间：2026-09-21 02:05
- AIHOT 分数：76
- AIHOT 标记：精选
- AIHOT 链接：https://aihot.news/items/cmua567e703tmro5t558lzx7o
- 原文链接：https://www.buchodi.com/chatgpt-now-knows-what-you-do-on-other-websites-via-ad-collector

## 精选理由

作者以第一手流量捕获复现了 OpenAI 广告收集器的跨站追踪机制，读者可以据此理解 ChatGPT 账号与站外浏览行为的关联路径。

## AI 摘要

作者通过自己手机上的流量捕获复现了 OpenAI 广告收集器机制：bzr.openai.com 在 .openai.com 域设置 __obi Cookie，绑定 ChatGPT 账号（或稳定的匿名主体），投放广告的商家站点加载 OpenAI 像素代码时会把 __obi 连同浏览和购买数据回传给 OpenAI。

## 正文

OpenAI 的广告收集器位于 bzr.openai.com，会设置一个名为 __obi 的 cookie，作用域限定为 .openai.com。该值在你使用 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": "«redacted: 64-hex account subject»", "subject_type": "account_user", "obi": "«redacted: 22-char identifier»", "exp": "«iat + 60s»" }

sub 是账户。obi 是标识符。token 将二者绑定，作用域限定于收集器，并在 60 秒后过期。bzr 代表 bazaar，即 OpenAI 内部对广告平台的称呼；wadi 是签发服务。

第 2 步。该标识符成为 OpenAI 域名下的一个 cookie。

客户端将 {"token": "«JWT»"} 跨站 POST 到 bzr.openai.com/v1/obi/sync。响应如下：

Set-Cookie: __obi=«redacted»; Domain=.openai.com; HttpOnly; Max-Age=31536000; Path=/; SameSite=none; Secure

SameSite=none 与 Secure 是 cookie 在跨站请求中被发送所需的配置。Max-Age 为一年。JWT 中的 obi 值与 cookie 中的值完全相同。

第 3 步。广告主网站将其回传。

有三类请求会从广告主的页面发往 OpenAI 的主机。在一台 jar 中含有 __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/… 完全没有 cookie 头 对照组

第一行尤其值得关注。像素 SDK 有一条省略凭据的代码路径，但这无济于事：在 OpenAI 的任何代码运行之前，浏览器就已经把 cookie 附加到了加载该 SDK 的 <script src> 请求上。仅仅因为加载了这个标签，标识符就被泄露了。

随之传输的内容

同一个 SDK 还会从广告主的页面上收集身份信息。其载荷将四个来源分开，并由 OpenAI 自己标注：in 对应广告主有意传入的值，而 fm、ht、js 则对应 SDK 从表单字段、渲染后的页面文本以及标签管理器总线中抓取的值。在观测到的流量中，抓取到的身份信息数量超过了广告主提供的身份信息，分别为 685 个事件对 255 个。

标签管理器总线是电子邮件最大的来源。该 SDK 替换了window.dataLayer.push用自己的函数，还读取adobeDataLayer，并通过解析l=参数（来自gtm.jsscript 标签）来定位被重命名的 GTM 层。当前版本从中获取电子邮件和电话。0.1.31 版本在 8 月 27 日缩小范围之前，还获取了姓名和地理位置。

电子邮件、电话、名字和姓氏在传输前均经过 SHA-256 哈希处理。国家、地区、城市和邮政编码则以明文发送。邮政编码是被收集最多的表单字段，在 28 个网站上共发生 100 次事件。

URL 在发送前会被缩减为源站加路径；在观测到的 23,929 个 URL 中，没有一个携带查询字符串。路径得以保留，而到达收集器的路径中包括一种医疗状况、一个债务解决方案漏斗以及一份诉讼受理表单。

在 881 个已知设置的像素中，有 638 个启用了自动匹配，包括所有观察到的信贷和借贷广告主。它由 OpenAI 的 Ads Manager 控制。一份拒绝名单排除了密码、一次性验证码、卡号、SSN、出生日期、病史、诊断和法院相关字段。

该 cookie 被设计为可跨站点使用

在相同的广告主页面请求中，浏览器屏蔽了所有其他 OpenAI cookie：

Cookie 结果

oai-did、oaicom-stable-id 已拦截，SameSite=Lax

oai-client-auth-info，会话 cookie 已拦截，域名不匹配

__obi 已发送

__obi 是唯一配置了 SameSite=None 的 OpenAI 标识符。

观测到的触达范围

在我的设备上，一个 __obi 值从 12 个商业网站通过 13 个不同的像素 ID 被发送至 OpenAI，其中包括 Chewy、Wayfair、ThriftBooks、Eventbrite、HelloFresh、Coursera 和 SeatGeek。每个请求都以 202 被接受。

在更广泛的流量中，30 个不同的 __obi 值中有 12 个出现在不止一个广告主名下，其中一个出现在十个广告主名下。

在你登出状态下它依然有效

在 932 个已解码的同步 token 中，736 个携带 subject_type: account_user，196 个携带 anonymous。匿名主体与账户主体一样稳定：每台设备一个，至少持续 27 天。

OpenAI 的 cookie 政策怎么说

OpenAI 将 __obi 列在分析类 Cookie 下，有效期一年，出现在 chatgpt.com 和 openai.com 上。它是该栏目中唯一的条目。该政策将分析类 Cookie 描述为帮助 OpenAI 了解其服务的表现及使用情况。

OpenAI 将分析类和营销类作为两个独立的同意选项来运行，即 oai_consent_analytics 和 oai_consent_marketing，而我解码的每一个同步 token 都带有 consent_decision: analytics_allowed。允许分析类但拒绝营销类的人就会得到这个。

OpenAI 的回应

我于 9 月 14 日将相关机制和两个问题发送至 press@openai.com 和 privacy@openai.com：为什么 __obi 被归类为分析类 cookie，以及一个授予分析同意但拒绝营销同意的用户是否仍会收到它。回复来自 OpenAI Support。它确认收到了询问，表示相关观察结果将在内部共享以供审查，但没有回答这两个问题中的任何一个。上述脚本加载观察是在询问发出之后做出的。如果 OpenAI 作出回应，我将更新本文。

局限

浏览器。 在 Android 版 Chrome 上观察到。Safari 的智能防跟踪会阻止所有第三方 cookie，而 iOS 上的 Chrome 运行于 WebKit，因此该机制在任何 iOS 浏览器上都不起作用。桌面版 Chrome 尚未测试。

门控。大约每五个 ChatGPT 会话中就有一个会生成同步 token。ChatGPT 的移动网页客户端在投放广告时完全不进行同步。按照以下步骤操作的人可能会看到像素触发，但没有附带任何 cookie。

这种关联并未被观测到。 202 意味着收集器接受了附带 cookie 的事件。OpenAI 在服务端将其解析到账户，这一点从设计上可以推断；我并未亲眼观察到这一过程。

Meta 多年前就构建了结构上等价的东西。一个已登录的账户、像素触发时的第三方 cookie、站外转化被解析到某个用户画像。这套机制是广告技术的标准做法。没有先例的是将其运行在 AI 聊天产品上。人们会向这些产品倾诉他们不会发在社交网络上的事情，而这些产品正越来越多地代表他们行事。

该像素的另一个 cookie 不会这样做。 __obref 设置在广告主自己的域名上。每个站点获得不同的值，任何站点都无法看到其他站点的值。在观测到的 2,860 个值中，有 2,828 个仅出现在一个广告主之下。

广告主看不到这一点。 __obi 属于一个他们的脚本无法读取的域名。他们安装了一个转化像素，却无从得知自己的访客正被解析到某个 ChatGPT 身份。
