具有独立分区状态 (CHIPS) 的 Cookie

允许开发者将 Cookie 选择启用“分区”存储,每个顶级网站都有一个单独的 Cookie 罐。

实现状态

浏览器支持

  • 114
  • 114
  • x
  • x

来源

什么是 CHIPS?

通过 Cookie 具有独立分区状态 (CHIPS),开发者可以选择将 Cookie 加入分区存储,并为每个顶级网站分别创建单独的 Cookie JAR,从而更好地保护用户隐私并提高安全性。

在不进行分区的情况下,第三方 Cookie 可让服务跟踪用户,并将来自许多不相关的顶级网站的用户信息���并在一起。这称为跨网站跟踪。

浏览器正在逐步淘汰未分区的第三方 Cookie,因此在第三方 Cookie 被屏蔽后,CHIPS、Storage Access APIRelated Website Sets 将成为从跨网站上下文(例如 iframe)中读取和写入 Cookie 的唯一方式。

<ph type="x-smartling-placeholder">
</ph> 显示如何在两个不同网站之间共享烹饪内容的示意图。
如果没有 Cookie 分区,第三方服务可以在嵌入到某个顶级网站时设置 Cookie,并在嵌入到其他顶级网站时访问同一个 Cookie。

CHIPS 引入了新的 Cookie 属性 Partitioned,以支持按顶级上下文划分的跨网站 Cookie。

Set-Cookie 标头:

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

JavaScript:

document.cookie="__Host-name=value; Secure; Path=/; SameSite=None; Partitioned;"

分区第三方 Cookie 将与最初设置它的顶级网站绑定,无法从其他位置访问。这样,由第三方服务设置的 Cookie 只能在最初设置它们的顶级网站相同的嵌入式环境中读取。

<ph type="x-smartling-placeholder">
</ph> 示意图:嵌入同一个第三方的两个不同网站将不再共享该第三方的 Cookie。
如果使用 Cookie 分区,当嵌入到某个顶级网站时设置 Cookie 的第三方服务嵌入到其他顶级网站后,就无法访问同一个 Cookie

对于分区 Cookie,当用户访问网站 A 且来自网站 C 的嵌入内容时,系统会将该 Cookie 保存在一个分区 jar 中,该分区仅用于由网站 C 在嵌入网站 A 时设置的 Cookie。只有当顶级网站为 A 时,浏览器才会发送该 Cookie。

当用户访问新的网站(例如网站 B)时,嵌入的 C 框架不会收到在网站 A 中嵌入 C 时设置的 Cookie。

如果用户将网站 C 作为顶级网站进行访问,那么当网站 C 嵌入网站 A 时所设置的分区 Cookie 也不会包含在该请求中。

<ph type="x-smartling-placeholder">
</ph> 显示当将同一个第三方嵌入两个不同的网站上时,不共享 Cookie 的示意图。
使用 Cookie 分区功能时,如果第三方服务在嵌入到某个网站时设置了 Cookie,那么即使用户将其作为顶级网站进行访问,也无法访问同一个 Cookie。

使用场景

例如,网站 retail.example 可能想与第三方服务 support.chat.example 合作,在其网站上嵌入一个支持聊天框。如今,许多嵌入式聊天服务依赖 Cookie 来保存状态。

<ph type="x-smartling-placeholder">
</ph> 显示包含嵌入式聊天微件的网站的示意图
顶级网站 Retail.example support.chat.example

如果无法设置跨网站 Cookie,support.chat.example 将需要寻找替代方法(通常更为复杂)来存储状态。或者,它需要嵌入到会带来风险的顶级页面中,因为它允许 support.chat.example 脚本获得对 Retail.example 的提升权限,例如访问身份验证 Cookie 的能力。

CHIPS 可让您更轻松地继续使用跨网站 Cookie,而不会遇到与未分区 Cookie 相关的风险。

CHIPS 示例用例包括跨网站子资源需要某种会话或持久状态概念(范围限定为单个顶级网站上的用户活动)的所有场景,例如:

  • 第三方聊天嵌入
  • 第三方地图嵌入
  • 第三方付款嵌入
  • 子资源 CDN 负载均衡
  • 无头 CMS 提供商
  • 用于提供不受信任的用户内容的沙盒网域(例如 googleusercontent.com 和 githubusercontent.com)
  • 第三方 CDN 利用 Cookie 投放由第一方网站上的身份验证状态控制的内容(例如,在第三方 CDN 上托管的社交媒体网站上的个人资料照片)
  • 前端框架依赖远程 API 对请求使用 Cookie
  • 需要按发布商确定状态范围的嵌入式广告(例如,捕获用户对该网站的广告偏好)

CHIPS 为何使用“选择启用”分区模型

随着浏览器逐步淘汰未分区的第三方 Cookie,我们尝试了几种其他的划分方法。

Firefox 宣布,在 ETP 严格模式和无痕浏览模式下,默认情况下会对所有第三方 Cookie 进行分区,因此所有跨网站 Cookie 都会按顶级网站进行分区。不过,在没有第三方选择启用的情况下对 Cookie 进行分区可能会导致意外错误,因为某些第三方服务构建的服务器需要使用未分区的第三方 Cookie。

Safari 以前尝试根据启发法对 Cookie 进行分区,但最终选择完全屏蔽它们,因为让开发者感到困惑是原因之一。最近,Safari 表示对一种基于“参与调查”模块的模式感兴趣

CHIPS 与分区 Cookie 的现有实现有别于其他第三方选择。必须使用���属性设置 Cookie,才能在(未分区的)第三方 Cookie 停用后通过跨多方请求发送 Cookie。

虽然第三方 Cookie 仍然存在,但 Partitioned 属性可让您选择启用更严格、更安全的 Cookie 行为。CHIPS 是帮助相关服务顺利过渡到不使用第三方 Cookie 的未来的重要步骤。

目前,Cookie 的键控于设置 Cookie 的网站的主机名或网域,即其主机密钥

例如,对于来自 https://support.chat.example 的 Cookie,主机密钥为 ("support.chat.example")

在 CHIPS 下,选择进行分区的 Cookie 将加在主机密钥和分区键上。

Cookie 的分区键是指浏览器在开始向设置 Cookie 的端点发出请求时访问的顶级网址的网站(架构和可注册域名)。

在前面的示例中,https://support.chat.example 嵌入在 https://retail.example 上,顶级网址为 https://retail.example

在这种情况下,分区键为 ("https", "retail.example")

同样,请求的分区键是请求开始时浏览器正在访问的顶级网址所在的网站。浏览器必须在与 Cookie 具有相同分区键的请求中发送具有 Partitioned 属性的 Cookie。

下面是之前示例中 Cookie 键在 CHIPS 前后的样子。

<ph type="x-smartling-placeholder">
</ph> 网站 A 和嵌入网站 C 共享一个分区 Cookie。如果未嵌入,网站 C 无法访问分区 Cookie。
网站 A 和嵌入网站 C 共享一个分区 Cookie。如果未嵌入,网站 C 将无法访问分区 Cookie。

条状标签之前

key=("support.chat.example")

CHIPS 之后

key={("support.chat.example"),("https", "retail.example")}

安全设计

为了鼓励良好的安全做法,使用 CHIPS,Cookie 仅由安全协议设置并通过安全协议发送。

  • 必须使用 Secure 设置分区 Cookie。
  • 建议您在设置分区 Cookie 时使用 __Host- 前缀,使其绑定到主机名(而不是可注册网域)。

示例:

Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;

CHIPS 替代方案

Storage Access API 和关联的 Related Website Sets (RWS) 是 Web 平��机制,可针对面向用户的特定目的启用有限的跨网站 Cookie 访问权限。

这些是 CHIPS 分区的替代方案,在需要访问未分区的跨网站 Cooke 的情况下。

如果您需要将同一 Cookie 用于嵌入多个相关网站的服务,请考虑使用 Storage Access API 和 Related Website Sets。

CHIPS 可将服务作为跨多个网站的独立组件发挥作用,而无需在多个网站上提供相同的 Cookie。如果该服务设置了分区 Cookie,其分区键将是顶级网站,而该 Cookie 将不适用于同样使用该服务的其他网站。

Related Website Sets 设计依赖于 Storage Access API,未与 CHIPS 分区集成。如果您的用例依赖于 RWS 内跨网站共享 Cookie 分区,您可以提供有关 GitHub 问题的示例和反馈

演示

演示将向您介绍分区 Cookie 的工作原理,以及如何在开发者工具中检查分区 Cookie。

网站 A 嵌入了网站 B 中的 iframe,后者使用 JavaScript 设置两个 Cookie:一个已分区 Cookie 和一个未分区 Cookie。网站 B 会显示可通过 document.cookie 从该位置访问的所有 Cookie。

如果第三方 Cookie 被屏蔽,网站 B 将只能在跨网站上下文中使用 Partitioned 属性设置和访问此 Cookie。

在允许第三方 Cookie 的情况下,网站 B 也能够设置和访问未分区 Cookie。

<ph type="x-smartling-placeholder">
</ph> 网站 A 和网站 B
左图:第三方 Cookie 已被屏蔽。右图:允许使用第三方 Cookie。

前提条件

  1. Chrome 118 或更高版本。
  2. 访问 chrome://flags/#test-third-party-cookie-phaseout 并启用此设置

使用开发者工具检查已分区 Cookie

  1. 访问 https://chips-site-a.glitch.me
  2. Control+Shift+J(在 Mac 上,按 Command+Option+J)打开开发者工具。
  3. 点击 Application 标签页。
  4. 导航至应用程序 >存储 >Cookie
  5. 点击 https://chips-site-b.glitch.me

开发者工具将显示来自所选来源的所有 Cookie。

<ph type="x-smartling-placeholder">
</ph>
在开发者工具的“Application”标签页中,来自网站 B 的 Cookie。

网站 B 只能在跨网站上下文中设置分区 Cookie,未分区 Cookie 将被阻止:

  • 您应该会看到 __Host-partitioned-cookie 带有顶级网站 https://chips-site-a.glitch.me 的分区键。
__Host-regional-cookie 的分区键。
  1. 点击前往网站 B
  2. 在 DevTools 中,导航至 Application >存储 >Cookie
  3. 点击 https://chips-site-b.glitch.me
网站 B
在顶级目录下,网站 B 可以查看所有已分区和未分区的 Cookie

在这种情形中,由于您在顶级上下文中位于网站 B,因此它可以设置和访问这两个 Cookie:

  • unpartitioned-cookie 的分区键为空。
  • __Host-partitioned-cookie Cookie 具有分区键 https://chips-site-b.glitch.me
作为顶级网站访问网站 B 时,在开发者工具的“应用程序”标签页中来自网站 B 的 Cookie。__主机分区 Cookie 的分区键为 https://chips-site-b.glitch.me。

如果您返回网站 A,则 unpartitioned-cookie 现在已存储在浏览器中,但您无法从网站 A 访问该网站。

  1. 点击转到网站 A
  2. 点击网络标签页。
  3. 点击 https://chips-site-b.glitch.me
  4. 点击 Cookies 标签。

在网站 A 上,您应该会看到 __Host-partitioned-cookie 以及顶级网站 https://chips-site-a.glitch.me 的分区键。

<ph type="x-smartling-placeholder">
</ph>
“Network”标签页,显示了来自网站 B 的 iframe(在网站 A 上嵌入后可访问)的 Cookie。

如果您选中显示已过滤的 Cookie 请求,则开发者工具将会显示未分区的 Cookie 已被屏蔽,并以黄色突出显示,并显示一条提示:“此 Cookie 因用户偏好设置而被屏蔽”。

<ph type="x-smartling-placeholder">
</ph>
显示来自网站 B iframe 的被拦截 Cookie 的“广告联盟”标签页。

应用程序 >存储 >点击 https://chips-site-b.glitch.me 的 Cookies 将显示:

  • unpartitioned-cookie 替换为空分区键。
  • 具有分区键 https://chips-site-a.glitch.me__Host-partitioned-cookie Cookie。
在开发者工具的“Application”标签页中,来自网站 B 的 Cookie。__Host-partitioned-cookie Cookie 具有分区键 https://chips-site-a.glitch.meunpartitioned-cookie 已显示,但当网站 B 嵌入网站 A 时,网站 B 的 iframe 无法访问。

清除 Cookie

要重置演示,请清除该网站的所有 Cookie:

  • Control+Shift+J(在 Mac 上,按 Command+Option+J)打开开发者工具。
  • 点击 Application 标签页。
  • 导航至应用程序 >存储 >Cookie
  • 右键点击 https://chips-site-b.glitch.me
  • 点击清除

资源