Cookies 分区策略带来的影响

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2024/01/22/cookies-partition/

Cookies 分区策略(Partitioned Cookies)是 Google 提出的一套第三方 Cookies 限制方案,为了避免广告商跨站点跟踪客户。

第三方 Cookies(Third-party cookies)是指 Cookies 所在的 SLD (二级域名,比如 example.comexample.net)与当前站点的 SLD 不一致。另外对于一些公共空间子域可能也被认为是跨站 Cookies,比如 a.github.iob.github.io 之间可能也是跨站 Cookies,因为 *.github.io 被视为是公共命名空间。

实现方案,简单来说,就是原本两个 SLD 的站点 A 和 B,在 A 站点的页面下,通过跨域请求向 B 站点(任何子域名)写入 Cookie 成功后,访问 B 站点页面时,这个 Cookie 是直接可见的。但是在实施了分区策略以后,直接访问 B 站点,是无法使用这个 Cookie 的,只有在 A 站点的页面上,跨域访问 B 站点的资源时,才会携带这个 Cookie。

这样带来的影响是什么呢,以广告为例,如果站点 B 是一个广告服务商,那么 A、C、D、E 等站点原本都可以通过向 B 站点发送跨域请求共享 B 站点的 Cookie,从而达到跨站点跟踪客户行为的效果。而在 Cookies 分区后,这就做不到了,因为 A-BC-BD-BE-B 现在是 4 个独立的 Cookie,彼此之间无法产生关联,也就失去了联合追踪的效果。

这是对于广告商的影响,另外一种影响就是跨 SLD 的单点登录。以往的跨 SLD 单点登录无非就是 iframe(如 Google 的 Login with Google widget) 或者 P3P。而这些在 Cookies 分区策略下,完全失效了。如果还想实现跨 SLD 的单点登录,只能使用 FedCM(Federal Credential Management)和 OAuth 协议了。

注意,Cookies 分区策略只影响跨 SLD 的情况,同一个 SLD 下是不受影响的。

这里顺便补充一下第一方 Cookies(也就是相同 SLD)下跨不同子域名写 Cookies 的限制:

  1. 同一个 SLD 下,通过 CORS 跨(子)域写对方的 Cookies,是可以写下对方的第一方 Cookies 的,不受分区存储限制。
  2. 调用方的 CORS 配置必须设置 withCredentials=true
  3. 服务端的 CORS 响应头必须设置 Access-Control-Allow-Credentials: true
  4. SameSite 不影响同 SLD 的 CORS Cookies 读写,因此建议一律配置为 Strict
  5. 直接在前端通过 document.cookie = 'a=b; domain=another.b.com' 写入另一个子域名的 Cookies 是不行的,必须通过 CORS 跨越调用。

根据以上策略,在相同 SLD 下,实现静默单点登录(Silently SSO,即用户无感知的单点登录)还是很容易的。

comments powered by Disqus