banner
是Karry呀

Karry's SweetHouse

一直摆烂一直爽!!!
github
bilibili
zhihu
twitter_id
steam

禁用第三方cookie是趋势,日后还如何调用第三方cookie?

发生了什么?#

在最近发布的 Chrome 113、114 两个版本中,有两个关于 Cookie 的变化:
Chrome 113:Cookie 第一方集(First-Party Sets)进入稳定版本;
Chrome 114:Cookie 独立分区(CHIPS)默认对所有浏览器启用;
image
这两个都是针对 Cookie 访问方式的变化,为的就是应对即将来临的三方 Cookie 全面弃用。Chrome 在两年前就已经计划全面弃用方 Cookie 了,因为这个变化对现在的网站影响太大了,如果直接弃用,可能会导致大量网站的正常功能无法正常使用。

Chrome 计划在 2024 年 Q3 彻底禁用第三方 Cookie。
以下内容引自 Google 开发者网站隐私沙箱文章。

在 privacysandbox.com 时间表上,您可以看到 2023 年第 4 季度和 2024 年第 1 季度的两个里程碑,这是 Chrome 协助测试模式的一部分。此测试主要面向测试 Privacy Sandbox 相关性和效果衡量 API 的组织,但在此过程中,我们已为 1% 的 Chrome 稳定版用户停用第三方 Cookie。
image
弃用第三方 Cookie 的时间表。

作为 Chrome 协助测试的一部分,“使用标签模式选择启用测试” 从 2023 年第 4 季度开始,并于 2024 年 1 月 4 日开始针对 1% 的 3PC 限制。两者都会持续到 2024 年第 3 季度中期,届时第三方 Cookie 逐步淘汰开始。
这意味着,从 2024 年初开始,即使您未积极参与 Chrome 协助测试,在停用第三方 Cookie 的情况下,也会有更多 Chrome 用户访问您的网站。该测试期将持续到 2024 年第 3 季度。在与 CMA 协商后,为了解决与竞争相关的顾虑,我们计划开始为所有 Chrome 用户停用第三方 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 为此提供了四种解决办法:

image

我们今天以我的 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, 这里是效果:

image

但是!!!
如果禁用了第三方 Cookie, 这个属性就读不到数据了。测试方法也在 Chrome 的文章里提供了:

为支持在 Chrome 中弃用第三方 Cookie 的 1% 测试和磨合阶段中的测试场景,我们提供了多个 Chrome 标志。
在 Chrome 121 及更高版本中,您可以模拟逐步淘汰第三方 Cookie 后的状态:

  • 启用 chrome://flags/#test-third-party-cookie-phaseout
  • 使用标记--test-third-party-cookie-phaseout通过命令行运行 Chrome
    这会将 Chrome 设置为屏蔽第三方 Cookie,并确保新功能和缓解措施均有效。

设置后:
image

在 i1.yuereqb.cn 这个界面读不到 cookie 了,但在暮光方块论坛嵌入这个域名又能读到,考虑到是不是现在浏览器忘记考虑这个情况了。

image

image

目前给的方法是,想要在当前网站上保留需要共享的三方 Cookie ,只需要在种这个 Cookie 的时候添加一个 Partitioned 属性,另外还有个前提是 Cookie 必须具有 Secure 属性:

Set-Cookie: name=name; SameSite=None; Secure; Path=/; Partitioned;

目前,Chrome 扩展还不能设置Partitioned这个属性,会报错。

Partitioned的读取模式,是每个站点单独读取,Google 画了一个示意图来描述:

image
上图描绘的是现状,没有 partitioned 的 cookie 读取模式。

image
上图描绘启用 Cookie 分区功能后,如果某项第三方服务嵌入一个顶级网站时会设置 Cookie,而该服务嵌入到其他顶级网站中时便无法访问同一 Cookie。
image
上图描绘启用 Cookie 分区功能后,如果某项第三方服务在嵌入网站时设置了 Cookie,那么即使用户以顶级网站的身份访问该服务,该服务也无法访问同一 Cookie。

所以,目前的情况就是,扩展只能先这样,必须等 Chrome 日后的更新,看扩展有没有权限操作这个,若没有,以后这个项目就只能歇菜了。

对其他服务的建议#

最好以后非必要不使用第三方 cookie,毕竟 cookie 只是传递的一种方式,以后尽量使用别的方式,若必须读取 cookie,就需要考虑这个 cookie 是否需要被第三方读取,然后再考虑这些第三方网站的情况了。

现在只能祈祷未来的路没有那么难走了...

先写到这里,待后更新!

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。