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.com
、example.net
)与当前站点的 SLD 不一致。另外对于一些公共空间子域可能也被认为是跨站 Cookies,比如a.github.io
和b.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-B
、C-B
、D-B
、E-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 的限制:
- 同一个 SLD 下,通过 CORS 跨(子)域写对方的 Cookies,是可以写下对方的第一方 Cookies 的,不受分区存储限制。
- 调用方的 CORS 配置必须设置
withCredentials=true
。 - 服务端的 CORS 响应头必须设置
Access-Control-Allow-Credentials: true
。 - SameSite 不影响同 SLD 的 CORS Cookies 读写,因此建议一律配置为
Strict
。 - 直接在前端通过
document.cookie = 'a=b; domain=another.b.com'
写入另一个子域名的 Cookies 是不行的,必须通过 CORS 跨越调用。
根据以上策略,在相同 SLD 下,实现静默单点登录(Silently SSO,即用户无感知的单点登录)还是很容易的。