[OUTDATED] First-Party Set 和 SameParty 属性

许多组织都有使用不同域名(例如 brandx.sitefly-brandx.site)或不同国家/地区域名(例如 example.comexample.rsexample.co.uk 等)的相关网站。

浏览器正朝着废弃第三方 Cookie 的方向发展,以改善网络上的隐私保护,但此类网站通常依赖 Cookie 来实现需要跨网域维护和访问状态的功能(例如单点登录和意见征求管理)。

在第一方和第三方获得不同的处理方式的情况下,First-Party Sets 可允许将由同一实体拥有和运营的相关域名视为第一方。第一方集合中的域名被视为第一方,它们可以标记要在第一方环境中设置或发送的 Cookie。我们的目标是在防止第三方跨网站跟踪的同时,保持不会破坏有效用例的路径。

第一方组提案目前处于测试阶段,请继续阅读,了解其运作方式以及如何试用。

第一方 Cookie 与第三方 Cookie 有何区别?

Cookie 本身并非第一方或第三方,具体取决于 Cookie 所在的当前情境。您可以在请求的 cookie 标头中添加该令牌,也可以通过 JavaScript 中的 document.cookie 添加该令牌。

例如,如果 video.site 包含 theme=dark Cookie,那么当您浏览 video.site 并向 video.site 发出请求时,便属于同一网站环境,并且包含的 Cookie 是第一方 Cookie

但是,如果您位于 my-blog.site 上,并且 my-blog.site 嵌入了 video.site 的 iframe 播放器,那么当 my-blog.sitevideo.site 发出请求时,这属于跨网站环境,并且 theme Cookie 是第三方 Cookie。

显示来自 video.site 的 Cookie 在两个上下文中的示意图。如果顶级环境也是 video.site,则 Cookie 属于同一网站。如果顶级环境为 my-blog.site,并且 video.site 位于 iframe 中,则 Cookie 是跨网站 Cookie。

Cookie 是否包含取决于 Cookie 的 SameSite 属性:

  • 同源环境SameSite=LaxStrictNone)会使 Cookie 成为第一方 Cookie
  • 使用 SameSite=None跨网站情境会使 Cookie 成为第三方 Cookie

不过,这并不总是如此。假设 brandx.site 是一个旅行预订网站,并且还使用 fly-brandx.sitedrive-brandx.site 来区分航班和租车。在预订单次行程的过程中,访问者会在这些网站之间切换,选择不同的选项,他们希望自己选择的“购物车”在这些网站之间保持不变。brandx.site 使用 SameSite=None Cookie 管理用户的会话,以允许在跨网站情境中使用该会话。不过,缺点是,现在该 Cookie 没有跨站请求伪造 (CSRF) 保护。如果 evil.site 包含对 brandx.site 的请求,则会包含该 Cookie!

该 Cookie 是跨网站 Cookie,但所有这些网站均归同一组织所有和运营。访问者也知道这是同一组织,并希望在这些网站上拥有相同的会话,也就是说,拥有共享的身份。

示意图:如果网站属于同一 First-Party Set,则 Cookie 可能仍会包含在跨网站环境中,但如果属于该集合之外的跨网站环境,则会被拒绝。

First-Party Sets 政策

First-Party Set 提出了一种方法,用于在同一实体拥有和运营的多个网站中明确定义此关系。这样,brandx.site 就可以定义其与 fly-brandx.sitedrive-brandx.site 等的第一方关系。

推动各种 Privacy Sandbox 提案的隐私保护模型基于身份分区概念,以防止跨网站跟踪,即在网站之间划定边界,限制对可用于识别用户的任何信息的访问。

显示非分区状态的示意图:在这种状态下,同一第三方 Cookie 可在多个跨网站情境中访问,而分区模型则是每个顶级情境都有一个单独的跨网站 Cookie 实例,这会阻止跨这些网站关联活动。

虽然默认选项是按网站进行分区,这可以解决许多第一方用例,但 brandx.site 示例表明,第一方可以不仅仅局限于一个网站。

此图展示了当所有这些网站都属于同一组时,一组 Cookie 的同一实例如何包含在跨网站上下文中。

First-Party Set 提案的一项重要内容是确保跨浏览器的政策可防止滥用或误用。例如,第一方组合不得允许在无关的网站之间交换用户信息,也不得对不归同一实体所有的网站进行分组。其目的是确保 First-Party Set 映射到用户认为是第一方的对象,而不是用于在不同方之间共享身份。

网站注册第一方集的一个可能方法是,将其提议的一组网域以及满足浏览器政策所需的信息提交给公共跟踪器(例如专用 GitHub 代码库)。

按照政策验证 First-Party Set 断言后,浏览器便可以通过更新流程提取集合列表。

来源测试有已定义的政策,但该政策尚未最终确定,但原则可能会保持不变:

  • First-Party Set 中的网域必须由同一组织拥有和运营。
  • 用户应能将这些网域作为一个群组识别出来。
  • 这些网域应共享一个通用隐私权政策。

如何定义第一方组合

确定贵组织第一方组合的成员和所有者后,您需要提交拟议组合以供审批,这是至关重要的一步。具体流程仍在讨论中。

如需声明第一方组,列出成员和所有者的静态 JSON 资源应托管在每个包含网域的顶级 /.well-known/first-party-set 中。

brandx 第一方组示例中,所有者网域在 https://brandx.site/.well-known/first-party-set 托管以下内容:

{
  "owner": "brandx.site",
  "version": 1,
  "members": ["fly-brandx.site", "drive-brandx.site"]
}

该集合的每个成员还托管一个指向该集合的所有者的静态 JSON 资源。在 https://fly-brandx.site/.well-known/first-party-set 中,我们有:

{ "owner": "brandx.site" }

https://drive-brandx.site/.well-known/first-party-set 中:

{ "owner": "brandx.site" }

第一方组有一些限制:

  • 一个合集只能有一个所有者。
  • 成员只能属于一个集合,不能重叠或混合。
  • 成员列表应保持相对易于阅读,并且不应过大。

First-Party Sets 对 Cookie 有何影响?

Cookie 的匹配成分是建议的 SameParty 属性。指定 SameParty 会指示浏览器在其上下文与顶级上下文属于同一第一方集合时包含该 Cookie。

也就是说,如果 brandx.site 设置此 Cookie,则:

Set-Cookie: session=123; Secure; SameSite=Lax; SameParty

然后,当访问者位于 fly-brandx.site 且请求发送到 brandx.site 时,该请求中将包含 session Cookie。如果某个不属于第一方网站集的其他网站(例如 hotel.xyz)向 brandx.site 发送请求,则该 Cookie 不会包含在内。

显示在跨网站情境中允许或阻止 brandx.site Cookie 的图表,如前所述。

SameParty 获得广泛支持之前,请将 SameSite 属性与其搭配使用,以定义 Cookie 的回退行为。您可以将 SameParty 属性视为在 SameSite=LaxSameSite=None 之间提供设置。

  • SameSite=Lax; SameParty扩展 Lax 功能,在受支持的情况下纳入同一方情境,但如果不受支持,则会回退到 Lax 限制。
  • SameSite=None; SamePartyNone 功能限制为仅限同一方情境(如果受支持),但如果不受支持,则会回退到更广泛的 None 权限。

还有一些额外要求:

  • SameParty Cookie 必须包含 Secure
  • SameParty Cookie 不得包含 SameSite=Strict

Secure 是强制性要求,因为这仍然是跨网站请求,您应通过确保安全的 (HTTPS) 连接来降低这些风险。同样,由于这是一种跨网站关系,SameSite=Strict 无效,因为它仍然允许在集合内进行严格的基于网站的 CSRF 保护。

First-Party Set 适合哪些用例?

如果组织需要在不同的顶级网站之间共享身份,First-Party Set 非常适合。在本例中,共享身份意味着任何内容,从完整的单点登录解决方案到只需要跨网站共享偏好设置。

您的组织可能具有不同的顶级域名,用于:

  • 应用网域office.comlive.commicrosoft.com
  • 品牌网域amazon.comaudible.com / disney.compixar.com
  • 启用本地化的针对特定国家/地区的网域google.co.ingoogle.co.uk
  • 用户从不直接与之互动,但在同一组织的网站上提供服务的服务网域gstatic.comgithubassets.comfbcdn.net
  • 用户从不直接与之互动,但出于安全原因而存在的沙盒网域googleusercontent.comgithubusercontent.com

如何参与?

如果您有一组符合上述条件的网站,则可以通过多种方式参与计划。最轻松的做法是阅读这两项提案并参与讨论:

在测试阶段,您可以使用 --use-first-party-set 命令行标志并提供网站的逗号分隔列表来试用此功能。

您可以在演示网站 https://fps-member1.glitch.me/ 上试用此功能,只需启动 Chrome 并设置以下标志即可:

--use-first-party-set=https://fps-member1.glitch.me,https://fps-member2.glitch.me,https://fps-member3.glitch.me

如果您想在开发环境中进行测试,或者想尝试在真实环境中添加 SameParty 属性,以了解第一方 Cookie 集对 Cookie 有何影响,这会很有帮助。

如果您有时间进行实验和反馈,还可以注册参与针对第一方集和 SameParty 的源试用,该试用在 Chrome 89 到 93 版中提供。

如何更新来源试用版的 Cookie

如果您要加入源试用并测试 Cookie 的 SameParty 属性,请考虑以下两种模式。

选项 1

首先,如果您有标记为 SameSite=None 但希望限制在第一方环境中的 Cookie,可以为其添加 SameParty 属性。在启用了来源试用版的浏览器中,系统不会在集合之外的跨网站情境中发送 Cookie。

不过,对于源试用版之外的大多数浏览器,Cookie 将继续照常跨网站发送。不妨将其视为一种渐进式增强方法。

之前set-cookie: cname=cval; SameSite=None; Secure

之后set-cookie: cname=cval; SameSite=None; Secure; SameParty

选项 2

第二种方法需要完成的工作更多,但可以将原始试用版与现有功能完全分离,并且可以专门测试 SameSite=Lax; SameParty 组合。

之前set-cookie: cname=cval; SameSite=None; Secure

之后:

set-cookie: cname=cval; SameSite=None; Secure
set-cookie: cname-fps=cval; SameSite=Lax; Secure; SameParty

在传入请求中检查 Cookie 时,您应该只会在涉及的网站位于该集合中且浏览器处于来源试用阶段时,在跨网站请求中看到 cname-fps Cookie。不妨将此方法视为在停用旧版本之前并发发布更新版功能。

为什么您可能不需要第一方组合?

对于大多数网站,其网站边界是可接受的划分边界或隐私边界位置。CHIPS(具有独立分区状态的 Cookie) 就提出了这种方案,它会为网站提供一种通过 Partitioned 属性选择启用的方式,让网站仍然可以使用这些重要的跨网站嵌入、资源、API 和服务,同时防止跨网站身份信息泄露。

请考虑以下几点,它们可能意味着您的网站不需要设置:

  • 您托管在不同的来源(而非不同的网站)上。在上面的示例中,如果 brandx.site 包含 fly.brandx.sitedrive.brandx.site,则这两个子网域都位于同一网站中。Cookie 可以使用 SameSite=Lax,无需进行设置。
  • 您向其他网站提供第三方嵌入内容。在简介中,video.site 中嵌入的 my-blog.site 视频示例是一个明显的第三方分界。这两个网站由不同的组织运营,用户将其视为不同的实体。这两个网站不应同时出现在同一组中。
  • 您提供第三方社交登录服务。使用 OAuth 或 OpenId Connect 等身份提供方通常依赖于第三方 Cookie,以便为用户提供更顺畅的登录体验。这是一个有效的用例,但不适用于 First-Party Sets,因为组织存在明显差异。WebID 等早期提案正在探索实现这些用例的方法。