状态分区是 Firefox 中一项新隐私功能的术语,称为“全面 Cookie 保护”,它将在 Firefox 86 中的 ETP 严格模式下提供。本文展示了状态分区在 Firefox 中的工作原理,并解释了第三方集成开发人员如何与最新更改保持兼容。
网站利用各种不同的 API 在浏览器中存储数据。最著名的是 Cookie,它们通常用于构建登录会话并提供个性化的用户体验。我们将这些 API 称为有状态 API,因为它们能够建立在重新加载、导航和浏览器重启中持续存在的状态。虽然这些 API 允许开发人员丰富用户的网络体验,但它们也能够实现恶意的网络跟踪,从而危及用户隐私。为了对抗这些 API 的滥用,Mozilla 在 Firefox 86 中引入了状态分区。
Firefox 中的有状态 Web API 是
- 存储:Cookie、本地存储、会话存储、缓存存储和 IndexedDB
- 工作线程:SharedWorkers 和 ServiceWorkers
- 通信通道:广播通道
为了对抗网络跟踪,Firefox 目前依赖于 增强型跟踪保护 (ETP),它根据 Disconnect 列表 阻止来自已知跟踪器的 Cookie 和其他共享状态。这种形式的 Cookie 阻止是阻止跟踪的有效方法,但它也有局限性。ETP 保护用户免受 3000 个最常见和普遍识别的跟踪器的侵害,但它的保护依赖于列表的完整性和始终保持最新。确保完整性很困难,跟踪器可以尝试通过注册新的域名来规避列表。此外,识别跟踪器是一项耗时的任务,通常需要数月时间才能将新的跟踪域添加到列表中。
为了解决 ETP 的局限性并提供对跟踪器的全面保护,我们引入了一种称为状态分区的技术,它将防止基于 Cookie 的跟踪普遍发生,而无需列表。
状态分区得到了我们努力消除非传统存储机制(“超级 Cookie”)作为跟踪向量的使用,例如 通过网络状态分区,最近在 Firefox 85 中推出。
状态分区 - 它在 Firefox 中如何工作
为了解释状态分区,我们首先应该看看有状态 Web API 如何在网络上实现跟踪。虽然这些 API 不是为跟踪而设计的,但它们的状态与网站共享,无论它是作为第一方加载还是作为第三方嵌入,例如在 iframe 中或作为简单的图像(“跟踪像素”)。这种共享状态允许嵌入在其他网站中的跟踪器跨网络跟踪你,最常见的方法是设置 Cookie。
例如,如果 foo.com 和 bar.com 都将 www.tracker.com 作为第三方嵌入,则 www.tracker.com 的 Cookie 将在 foo.com 和 bar.com 上共享。因此,www.tracker.com 可以通过使用 Cookie 作为标识符来连接你在这两个网站上的活动。
ETP 将通过简单地阻止对嵌入的 www.tracker.com 实例的共享状态的访问来防止这种情况。没有设置 Cookie 的能力,跟踪器就无法轻松地重新识别你。

未经保护的基于 Cookie 的跟踪,www.tracker.com 的两个实例共享相同的 Cookie。
相比之下,状态分区也将防止共享的第三方状态,但它不会完全阻止 Cookie 访问。使用状态分区,共享状态(如 Cookie、localStorage 等)将按你正在访问的顶级网站进行分区(隔离)。换句话说,每个第一方及其嵌入的第三方上下文将被放入一个独立的桶中。
Firefox 使用双重键控来实现状态分区,这将在访问这些状态的网站来源中添加一个额外的键。我们使用方案和 可注册域(也称为 eTLD+1)作为顶级网站的额外键。按照上述示例,www.tracker.com 的 Cookie 将在 foo.com 和 bar.com 下使用不同的键控。存储分区不会查找 www.tracker.com 的 Cookie 存储,而是分别使用 www.tracker.com^http://foo.com 和 www.tracker.com^http://bar.com。

通过双重键控 www.tracker.com 的两个实例来防止状态分区阻止基于 Cookie 的跟踪。
因此,在这两个顶级网站下,www.tracker.com 将有两个不同的 Cookie 存储。
这消除了跟踪器使用 Cookie 和以前共享的状态来识别跨网站的个人用户的可能性。现在,状态是分开的(“分区”),而不是跨不同的第一方域共享。
重要的是要了解状态分区将应用于每个嵌入的第三方资源,无论它是否是跟踪器。
这为隐私带来了巨大的好处,使我们能够将保护扩展到 Disconnect 列表之外,并允许嵌入的网站继续像往常一样使用它们的 Cookie 和存储,只要它们不需要跨站点访问。在下一节中,我们将检查嵌入的网站在确实需要跨站点共享状态时可以做什么。
状态分区 - 网络兼容性
鉴于状态分区对 Firefox 带来了根本性的改变,确保网络兼容性和用户和开发人员不间断的体验是首要关注的问题。不可避免地,状态分区会通过阻止第三方状态的合法使用来破坏网站。例如,单点登录 (SSO) 服务依赖于第三方 Cookie 在多个网站上登录用户。状态分区将破坏 SSO,因为 SSO 提供者将无法访问其第一方状态,因为它嵌入在另一个顶级网站中,因此无法识别已登录的用户。

由状态分区分区的第三方 SSO Cookie,SSO iframe 无法获取第一方 Cookie 访问权限。
为了解决状态分区的这些兼容性问题,我们允许在某些情况下取消分区状态。当取消分区生效时,我们将停止使用双重键控并恢复普通的(第一方)键。
考虑到上述示例,在取消分区后,顶级 SSO 网站和嵌入的 SSO 服务的 iframe 将开始使用相同的存储键,这意味着它们将访问相同的 Cookie 存储。因此,iframe 可以通过第三方 Cookie 获取登录凭据。

SSO 网站已取消分区,SSO iframe 获取了第一方 Cookie 访问权限。
状态分区 - 获取跨站点 Cookie 访问权限
Firefox 可能会在两种情况下取消分区网站的状态,以允许访问第一方(跨站点)Cookie 和其他状态
- 当嵌入的 iframe 调用存储访问 API 时。
- 根据一组自动启发式算法。
存储访问 API
存储访问 API 是一个新提出的 JavaScript API,用于处理现代浏览器中隐私保护的合法例外情况,例如 Firefox 中的 ETP 或 Safari 中的智能跟踪防止。它允许受限的第三方上下文为自己请求第一方存储访问权限(访问 Cookie 和其他共享状态)。在某些情况下,浏览器会显示一个权限提示,让你决定是否信任第三方以允许此访问权限。

存储访问 API 的 Firefox 用户提示。
已分区的第三方上下文可以使用存储访问 API 获取存储权限,该权限授予对其实方状态的取消分区访问权限。
此功能通过 document.requestStorageAccess 方法表达。另一种方法,document.hasStorageAccess,可用于找出当前浏览上下文是否可以访问其实方存储。如 MDN 所述,document.requestStorage 受到许多限制,这些限制是标准化的以及 浏览器特定的,可以保护用户免受滥用。开发人员应该注意这些限制,并相应地调整他们网站的用户体验。
例如,Zendesk 将显示一条消息,其中包含一个操作元素,用于处理 瞬时用户激活 (例如,单击按钮) 的标准要求。在 Safari 中,它还会弹出一个窗口,用户必须激活该窗口才能确保满足 Webkit 的浏览器特定要求。

Zendesk 通知,允许用户触发存储访问请求。
用户授予访问权限后,Firefox 将记住存储权限 30 天。
请注意,第三方上下文仅在已请求存储访问权限的顶级域下才不会被分区。对于其他顶级域,第三方上下文仍然会被分区。假设有一个跨域 iframe example.com 嵌入在 foo.com 中。example.com 使用存储访问 API 请求 foo.com 上的一方访问权限,并且用户允许它。在这种情况下,example.com 将对 foo.com 上自己的第一方 Cookie 进行无分区访问。稍后,用户加载另一个页面 bar.com,该页面也嵌入 example.com。但是,这一次,example.com 将在 bar.com 下保持分区状态,因为这里没有存储权限。
document.hasStorageAccess().then(hasAccess => { if (!hasAccess) { return document.requestStorageAccess(); } }).then(_ => { // 现在我们拥有未来 30 天的无分区存储访问权限! // // … }).catch(_ => { // 获取存储访问权限出错。 }); |
使用存储访问 API 从用户获取存储访问权限的 Javascript 示例。
目前,Safari、Edge 和 Firefox 支持存储访问 API。它在 Chrome 中处于功能标志后面。
通过启发式算法自动取消分区
在 Firefox 存储访问策略 中,我们定义了若干启发式算法来解决 Web 兼容性问题。这些启发式算法旨在捕获在 Web 上使用第三方存储的最常见情况(跟踪之外),并允许存储访问,以便网站能够正常运行。例如,在单点登录流程中,通常会打开一个弹出窗口,允许用户登录,并将该登录信息传回打开弹出窗口的网站。Firefox 会检测到这种情况并自动授予存储访问权限。
请注意,这些启发式算法并非为长期使用而设计的。对于需要无分区访问权限的网站,建议使用存储访问 API。我们将持续评估限制的必要性,并在适当情况下予以消除。因此,开发人员现在或将来不应依赖它们。
状态分区 - 用户控制跨站点 Cookie 访问
我们引入了状态分区的新 UI,使用户能够了解哪些第三方已获得无分区存储,并提供对存储访问的细粒度控制。Firefox 将在站点标识面板的权限部分显示无分区域。“跨站点 Cookie”权限表示无分区域,用户可以通过单击权限条目旁的取消按钮直接从 UI 中删除该权限。
关于 Johann Hofmann
Firefox 安全与隐私工程师
关于 Tim Huang
Firefox 隐私工程师
12 条评论