Cookies Having Independent Partitioned State (CHIPS)

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

Cookies Having Independent Partitioned State (CHIPS,也称为 Partitioned cookies) 允许开发者选择将 cookie 放入独立分区存储,每个顶级站点拥有独立的 cookie 罐。

在没有 cookie 分区的情况下,第三方 cookie 可以让服务跟踪用户,并将他们的信息关联到不相关的顶级站点。标记为 Partitioned 的 cookie 是双重键控的:由设置它们的源以及顶级页面的源共同决定。

这意味着它们只能在设置它们的顶级站点的上下文中读取。这可以阻止跨站点跟踪,同时仍允许第三方 cookie 的合法用途,例如在域名及其子域之间保持嵌入式地图或聊天小部件的状态,以及为子资源 CDN 负载均衡和无头 CMS 提供商保持配置信息。

CHIPS 是如何工作的?

为了理解 CHIPS 的工作原理,让我们看一个简短的例子。历史上,当一个站点通过 <iframe> 嵌入内容时,嵌入的内容能够响应跨站点请求,在用户的设备上设置 cookie。如果用户访问了嵌入相同内容的其他站点,嵌入的内容就可以访问最初由嵌入内容第一个实例设置的同一个 cookie。这使得内容所有者能够跨这些站点以及嵌入相同内容的任何其他站点跟踪用户活动。

例如

  1. 用户访问 https://site-a.example,它嵌入了来自 https://3rd-party.example 的内容。https://3rd-party.example 在用户的设备上设置了一个 cookie。
  2. 用户访问 https://site-b.example,它也嵌入了 https://3rd-party.example。这个新的 https://3rd-party.example 实例仍然可以访问用户在上一个页面时设置的 cookie。

这是因为历史上 cookie 是根据设置它们的站点的主机或域名(也称为主机键)来存储的。在上面的例子中,cookie 将以 ("3rd-party.example") 的键存储。

支持 CHIPS 的浏览器为 Set-Cookie HTTP 标头提供了一个新属性 — Partitioned — 当设置此属性时,站点所有者可以选择使用 CHIPS。

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

注意: Partitioned cookies 必须使用 Secure 进行设置。此外,您可以在设置 partitioned cookies 时使用 __Host 前缀,将其仅绑定到当前域或子域,如果您不需要在子域之间共享 cookie,建议这样做。

设置了 Partitioned 后,第三方 cookie 将使用两个键进行存储:主机键和一个新的分区键。分区键基于浏览器在请求设置 cookie 的 URL 端点时正在访问的顶级 URL 的方案和 eTLD+1

重新审视我们的例子

  1. 用户访问 https://site-a.example,它嵌入了来自 https://3rd-party.example 的内容。https://3rd-party.example 在用户的设备上使用 Partitioned 设置了一个 cookie,这意味着站点所有者选择了 CHIPS。
  2. 该 cookie 的存储键现在将是 {("https://site-a.example"), ("3rd-party.example")}
  3. 当用户访问 https://site-b.example(也嵌入 https://3rd-party.example)时,这个新的嵌入实例将无法访问该 cookie,因为分区键不匹配。

注意: CHIPS 类似于 Firefox 实现的 状态分区机制。然而,状态分区默认会为第三方上下文划分 cookie 存储,而 CHIPS 允许为第一方和第三方上下文选择加入分区 cookie。建议使用 CHIPS 的选择加入机制而不是状态分区,以提供最兼容的分区 cookie。

CHIPS 和子域

CHIPS 仍然允许跨不同站点子域嵌入的第三方内容访问该内容设置的第三方 cookie。让我们看一个使用第三方聊天服务的零售网站示例。

  1. 用户访问 https://shoppy.example,它嵌入了来自 https://3rd-party.example/chat 的第三方聊天服务,为需要帮助的用户提供支持。https://3rd-party.example/chat 在用户的设备上使用 Partitioned 设置了一个 cookie,以便在不同站点子域之间持久化聊天状态。
  2. 该 cookie 的存储键将是 {("https://shoppy.example"), ("3rd-party.example/chat")}
  3. 用户访问各种也嵌入 https://3rd-party.example/chat 的子域,包括 https://support.shoppy.examplehttps://checkout.shoppy.example。新的嵌入实例能够访问该 cookie,因为分区键仍然匹配。

规范

规范
Cookies Having Independent Partitioned State 规范
# section-2.1

浏览器兼容性

另见