发生了什么?#
在最近发布的 Chrome 113、114 两个版本中,有两个关于 Cookie 的变化:
Chrome 113:Cookie 第一方集(First-Party Sets)进入稳定版本;
Chrome 114:Cookie 独立分区(CHIPS)默认对所有浏览器启用;
这两个都是针对 Cookie 访问方式的变化,为的就是应对即将来临的三方 Cookie 全面弃用。Chrome 在两年前就已经计划全面弃用方 Cookie 了,因为这个变化对现在的网站影响太大了,如果直接弃用,可能会导致大量网站的正常功能无法正常使用。
Chrome 计划在 2024 年 Q3 彻底禁用第三方 Cookie。
以下内容引自 Google 开发者网站隐私沙箱文章。
弃用了 1% 的第三方 Cookie 以及 Chrome 协助测试#
在 privacysandbox.com 时间表上,您可以看到 2023 年第 4 季度和 2024 年第 1 季度的两个里程碑,这是 Chrome 协助测试模式的一部分。此测试主要面向测试 Privacy Sandbox 相关性和效果衡量 API 的组织,但在此过程中,我们已为 1% 的 Chrome 稳定版用户停用第三方 Cookie。
弃用第三方 Cookie 的时间表。作为 Chrome 协助测试的一部分,“使用标签模式选择启用测试” 从 2023 年第 4 季度开始,并于 2024 年 1 月 4 日开始针对 1% 的 3PC 限制。两者都会持续到 2024 年第 3 季度中期,届时第三方 Cookie 逐步淘汰开始。
这意味着,从 2024 年初开始,即使您未积极参与 Chrome 协助测试,在停用第三方 Cookie 的情况下,也会有更多 Chrome 用户访问您的网站。该测试期将持续到 2024 年第 3 季度。在与 CMA 协商后,为了解决与竞争相关的顾虑,我们计划开始为所有 Chrome 用户停用第三方 Cookie。
说了这么多,什么是第三方 Cookie?#
在跨网站上下文(例如 iframe 或子资源请求)中发送的 Cookie 通常称为第三方 Cookie。
这个变动会有什么影响?#
2019 年,浏览器改变了 Cookie 行为,将 Cookie 默认限制为仅限第一方访问。目前在跨网站上下文中使用的任何 Cookie 都必须使用 SameSite=None 属性进行设置。但在禁用第三方 cookie 后,即使设置了 SameSite=None,该 cookie 也不能被第三方读取。
比如我们现在正在抖音上刷视频,但是抖音上往往会加载很多三方广告商的请求,这些三方广告商就可以通过三方 Cookie 来记录一些用户的行为。然后下次你逛淘宝的时候,也可能再次加载到这个广告商,因为这时三方广告已经通过三方 Cookie 记录了你的很多用户行为,已经知道了你喜欢什么东西,所以你就会收到一些精准的广告推送,无形之中你的隐私已经泄漏出去了。
在海外,用户隐私可是相当 ZZ 正确的事,所以 Safira、Firefox 两大浏览器已经迫于压力禁用了三方 Cookie,也就是说,如果你在这两个浏览器上去访问 www.douyin.com 这个网站,那么再发送 bytedance.com 这个域名的请求是种不上 Cookie 的。
如果禁用了三方 Cookie ,那这种正常的在一家公司不同域名下共享 Cookie 的能力也就不能用了,这给正常的业务需求会带来很大的影响,一个常见的场景就是单点登录,我们往往在登陆一家公司的不同网站的时候只需要登陆一次,这是因为用户的个人信息存储在了一个公共的登录服务的 Cookie 上,禁用了三方 Cookie,那登录信息也就无法共享了。下面我们来看看如何解决以上的两个问题。
解决问题的设想#
Google 为此提供了四种解决办法:
我们今天以我的 bilibili 论坛高清嵌入为例子,使用第一种方法。其余方法可以看 https://developers.google.com/privacy-sandbox/3pcd?hl=zh-cn 。
由于这已经是一个用插件解决的问题了,因为我没有 bilibili 的控制权限(废话),所以在接下来的情况,若想要读取第三方 cookie,你至少需要有控制你所需第三方网站 cookie 的能力(包括自己写个插件,但显然不能用于大部分必须使用到第三方 cookie 情况),或者是能联系他们为你修改 cookie 属性的能力。
我的插件代码之前是这么写的:
let newCookie = {
url: `https://bilibili.com`,
name: cookie.name,
value: cookie.value,
domain: 'bilibili.com',
path: cookie.path,
secure: true,
httpOnly: cookie.httpOnly,
sameSite: "no_restriction",
expirationDate: cookie.expirationDate
};
这段代码,在目前的情况下仍然可用,因为我设置修改了这些 cookie 的 samesite 值为 None, 这里是效果:
但是!!!
如果禁用了第三方 Cookie, 这个属性就读不到数据了。测试方法也在 Chrome 的文章里提供了:
为支持在 Chrome 中弃用第三方 Cookie 的 1% 测试和磨合阶段中的测试场景,我们提供了多个 Chrome 标志。
在 Chrome 121 及更高版本中,您可以模拟逐步淘汰第三方 Cookie 后的状态:
- 启用
chrome://flags/#test-third-party-cookie-phaseout
- 使用标记
--test-third-party-cookie-phaseout
通过命令行运行 Chrome
这会将 Chrome 设置为屏蔽第三方 Cookie,并确保新功能和缓解措施均有效。
设置后:
在 i1.yuereqb.cn 这个界面读不到 cookie 了,但在暮光方块论坛嵌入这个域名又能读到,考虑到是不是现在浏览器忘记考虑这个情况了。
目前给的方法是,想要在当前网站上保留需要共享的三方 Cookie ,只需要在种这个 Cookie 的时候添加一个 Partitioned
属性,另外还有个前提是 Cookie 必须具有 Secure
属性:
Set-Cookie: name=name; SameSite=None; Secure; Path=/; Partitioned;
目前,Chrome 扩展还不能设置Partitioned
这个属性,会报错。
Partitioned
的读取模式,是每个站点单独读取,Google 画了一个示意图来描述:
上图描绘的是现状,没有 partitioned 的 cookie 读取模式。
上图描绘启用 Cookie 分区功能后,如果某项第三方服务嵌入一个顶级网站时会设置 Cookie,而该服务嵌入到其他顶级网站中时便无法访问同一 Cookie。
上图描绘启用 Cookie 分区功能后,如果某项第三方服务在嵌入网站时设置了 Cookie,那么即使用户以顶级网站的身份访问该服务,该服务也无法访问同一 Cookie。
所以,目前的情况就是,扩展只能先这样,必须等 Chrome 日后的更新,看扩展有没有权限操作这个,若没有,以后这个项目就只能歇菜了。
对其他服务的建议#
最好以后非必要不使用第三方 cookie,毕竟 cookie 只是传递的一种方式,以后尽量使用别的方式,若必须读取 cookie,就需要考虑这个 cookie 是否需要被第三方读取,然后再考虑这些第三方网站的情况了。
现在只能祈祷未来的路没有那么难走了...
先写到这里,待后更新!