一个名为 __obi 的 Cookie 能把 ChatGPT 的账号身份带到部署了 OpenAI 广告像素的第三方网站,让广告主把访问者和 ChatGPT 用户对应起来。它配的是 SameSite=None,有效期一年,是唯一能在跨站请求里带出去的 OpenAI 标识。有研究者在手机上用两种抓包方法复现了整套流程,覆盖一千多个主机名上的九百多个广告主像素。这篇文章把机制拆开讲,写给需要评估第三方像素风险的工程师和合规人员。
这个机制由哪三部分组成
- 签发令牌。客户端在 ChatGPT 页面生成 16 个随机字节,调用同步令牌接口,未登录时走匿名路径。后端返回 RS256 签名的 JWT,带同意决策字段、64 位十六进制账号主体和 22 字符标识,有效期 60 秒。
- 写入 Cookie。客户端把 JWT 跨站 POST 到收集域的同步接口,响应通过 Set-Cookie 种下
__obi,值和 JWT 里的标识一致。 - 广告主侧回传。之后带
__obi的请求有三种,加载分析脚本的 GET、带引荐参数的转化事件 POST、SDK 无凭据路径的裸 POST。
SameSite 属性为什么是关键
浏览器发起 script src 请求时就会附上 Cookie,此时站点代码还没运行,SDK 里省略凭据的选项拦不住。同一批广告主页面里,其他 OpenAI Cookie 全被拦下,两个稳定标识因为是 SameSite=Lax 无法跨站,会话类因域不匹配被拦,只有 __obi 能发出去。
同意分类与实际行为有什么落差
OpenAI 的 Cookie 政策把 __obi 归在分析类 Cookie 下,分析和营销是两个独立同意项。被解出的同步令牌全带允许分析的标记,只同意分析、拒绝营销的用户照样拿到 __obi,照样被第三方站点识别。这个落差来自令牌签发逻辑本身。
自动匹配和表单抓取覆盖到什么范围
自动匹配在已知设置的 881 个像素里对 638 个开启,含全部被观察到的信贷和借贷类广告主,开关在 OpenAI 广告管理后台。SDK 采集字段按来源分四类,OpenAI 自己标注,分别是广告主传入的值、从表单抓的值、从页面文本抓的值、来自标签管理器总线的值。实测抓到的身份信息数量是广告主主动提供的两倍多。标签管理器总线是邮箱地址的最大来源,SDK 重写常见数据层的推送方法,还解析脚本标签找出改了名的层。一个早期版本还采集姓名和地理位置,后来收窄了。
邮箱、电话、姓名传输前做 SHA-256,国家、地区、城市、邮编明文发送,邮编是被采集最多的表单字段。URL 只留源和路径,两万多条被观察请求没一条带查询串。收集端收到的路径里出现过医疗病情页、债务漏斗和诉讼咨询表单。屏蔽名单排除了密码、验证码、卡号、社保号、出生日期、病史和法院字段。
证据强度到底如何
研究者在手机上复现了整套流程,两种抓包方法交叉验证。同一个 __obi 值出现在 12 个商业网站的 13 个不同像素 ID 下,每个请求都返回 202。三十个不同值里有 12 个跨广告主出现,其中一个出现在十个广告主下。解出的令牌里大部分是账号主体,匿名主体每设备一个,至少存活 27 天。
局限也要讲清。观察只在 Android 版 Chrome 上完成,Safari 的 ITP 拦第三方 Cookie,iOS 上的 Chrome 也用 WebKit 内核,所以 iOS 浏览器上这套机制跑不起来,桌面 Chrome 没测。202 只证明请求被接受,不代表服务端已做关联。
在自己站点部署像素前要检查什么
- 以拒绝营销、仅允许分析的状态访问站点,抓包确认是否仍有
__obi被种下并随脚本请求发出。 - 检查表单字段是否含邮箱、电话、邮编,确认是否进入像素采集范围。
- 确认标签管理器数据层里的用户属性是否被读取。
- 核对隐私政策里关于第三方 Cookie 的表述,是否覆盖分析类 Cookie 被用于跨站识别。
常见问题
拒绝营销同意能挡住这个 Cookie 吗。 按现有观察不能,同步令牌带的是分析同意标记。
广告主自己能读到 __obi 吗。 不能,Cookie 属于 OpenAI 的域,识别发生在服务端。
iOS 用户受影响吗。 Safari 和 iOS 上的 Chrome 都拦第三方 Cookie,这套机制在 iOS 浏览器上观察不到。
202 说明数据被关联了吗。 只能说明请求被接受,服务端是否关联没有公开证据。