使用 Origin-Agent-Cluster 标头请求性能隔离

新的 HTTP 响应标头,用于限制域范围的脚本编写以及从浏览器请求专用资源。

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster 是一个新的 HTTP 响应标头,用于指示浏览器 同网站跨源网页之间的同步脚本访问。浏览器还可能会使用 Origin-Agent-Cluster,作为提示,您的源应获取自己的独立资源,例如 专用进程

浏览器兼容性

目前,仅在 Chrome 88 及更高版本中实现 Origin-Agent-Cluster 标头。它的设计宗旨是 原型设计工作,并且拥有 初步阳性 接待 是 Safari 使用的浏览器引擎 WebKit 的代表。

在此期间,可以顺利地将 Origin-Agent-Cluster 头文件部署到您的所有 用户数量。不能理解代码的浏览器会将其忽略。此外,由于 实际上,以源为键的代理集群可以执行的操作比以网站为键的代理集群要少一些 因此您无需担心互操作性问题。

为什么浏览器无法自动隔离同网站来源

该网络基于同源政策构建,这是一项安全功能, 会限制文档和脚本与来自其他资源的资源 origin。例如,https://a.example 上托管的某个网页位于 另一个来源为 https://b.examplehttps://sub.a.example

在后台,浏览器会以不同方式使用源站提供的分离机制。在旧版 天,即使不同的源无法访问彼此的数据, 共享操作系统线程、进程和内存分配等资源。这意味着,如果 一个标签页的运行速度就会变慢,这会拖慢所有其他标签页的运行速度。或者,如果某个标签页占用了过多内存, 会导致整个浏览器崩溃。

如今的浏览器更加成熟,会尝试将不同的来源区分为不同的来源 过程。此功能的具体工作方式因浏览器而异:大多数浏览器都有一定程度的分隔 ,但单个标签页中的不同 iframe 可能会共享一个进程。由于进程 都会有一些内存开销,因此它们使用启发式算法来避免生成过多的映像,例如 Firefox 具有用户可配置的进程限制, 而 Chrome 在桌面设备(内存充足)和移动设备(在移动设备中 )。

这些启发法并不完美。他们也有一个重要的限制: 同源政策的例外情况,允许子网域(例如 https://sub.a.examplehttps://a.example 互相通信,则浏览器无法自动将子网域从 相互交流。

这种默认行为称为“以网站为键的代理集群”:也就是说,浏览器根据 访问其网站。新的 Origin-Agent-Cluster 标头会要求浏览器更改此默认值 将该网页放入以为键的代理集群中,以便对该网页进行分组 只能与来源完全相同的其他网页共享。具体而言,同网站跨源网页 将被从代理集群中排除。

这种选择启用分离可让浏览器为这些以源为键的新代理集群提供自己的专属集群 专用资源,这些资源不会与其他来源的资源结合使用。例如,此类网页 可以有自己的进程,也可以被调度在单独的线程上。通过将 Origin-Agent-Cluster 标头,就向浏览器表明 可受益于此类专用资源。

但是,为了执行分离并获得这些优势,浏览器需要停用 一些旧版功能

以源为键的网页无法执行的操作

当您的页面位于以源为键的代理集群中时,您会放弃一些与同网站通信的能力 提供之前可用的跨源网页具体而言:

  • 您无法再设置 document.domain。这是一个 旧版功能通常允许同网站跨源网页同步访问 但在以源为键的代理集群中,它处于停用状态。

  • 您无法再发送 WebAssembly.Module 对象通过 postMessage() 传递给其他同网站跨源网页。

  • (仅限 Chrome)您无法再发送 SharedArrayBufferWebAssembly.Memory 对象与其他同网站跨源网页相关联。

何时使用以源为键的代理集群

Origin-Agent-Cluster 标头中受益的来源包括:

  • 尽可能利用他们自己的专属资源取得最佳效果。例如: 性能密集型游戏、视频会议网站或多媒体创作应用。

  • 包含来源不同但同网站的资源密集型 iframe。例如,如果 https://mail.example.com 可嵌入 https://chat.example.com 个 iframe、源键 https://mail.example.com/ 可确保聊天团队编写的代码不会意外触发 会干扰邮件团队编写的代码,并且可以提示浏览器 可以单独安排各个流程,降低彼此对性能的影响。

  • 预期会嵌入到同网站的不同来源网页中,但要知道自己会 会占用大量资源例如,如果 https://customerservicewidget.example.com 预期使用 大量的视频聊天资源,并将在整个社区的各个源中嵌入 https://*.example.com,维护该 widget 的团队可以使用 Origin-Agent-Cluster 来尝试降低其对嵌入器的性能影响。

此外,您还需要确保您可以停用上述很少使用的 跨源通信功能,并且您的网站使用了 HTTPS

但归根结底,这些只是一些指南。以源为键的代理集群是否有助于您的网站 最终是通过测量来确定的。具体来说,您需要衡量 您的网页指标,以及您的内存 用量,了解源密钥的影响。( 特别是,如果增加参与的进程数量, 每个进程的内存开销。)您不应只是推出源键控功能并寄希望于成果。

这与跨域隔离有何关系?

通过 Origin-Agent-Cluster 标头实现的代理集群的源键相关但彼此独立 来源、跨域隔离(通过 Cross-Origin-Opener-Policy)和 Cross-Origin-Embedder-Policy 标头。

任何将自身进行跨域隔离的网站也将停用同一同网站跨源 通信功能,如同使用 Origin-Agent-Cluster 标头时一样。不过, 除了跨域隔离之外,Origin-Agent-Cluster 标头仍然有用, 提示浏览器修改其资源分配启发法。因此,你仍应考虑 应用 Origin-Agent-Cluster 标头并衡量结果,即使是 已进行跨域隔离

如何使用 Origin-Agent-Cluster 标头

要使用 Origin-Agent-Cluster 标头,请配置您的网络服务器以发送以下 HTTP 响应标头:

Origin-Agent-Cluster: ?1

?1 的值是结构化 布尔值 true 的 header 语法 值。

请务必在来自源的所有响应中发送此标头,而不仅仅是部分网页。 否则,您可能会获得不一致的结果,即浏览器“记住”看到源键 请求,因此即使在未请求此令牌的网页上,它也会包含源密钥。反之亦然:如果首页 如果用户访问时没有标头,浏览器就会记住您的源不需要 以源为键,并且会忽略后续页面上的标头。

为什么浏览器不能始终遵循标头?

出现此“回忆”的原因是为了确保源站的密钥保持一致如果网页上的某些网页 来源设置了源键,而其他则没有,则您可以拥有两个同源网页, 处于不同的代理集群中,因此不允许彼此通信。结果为 这对于 Web 开发者和浏览器内部都很奇怪。因此,该规范 for Origin-Agent-Cluster 会忽略此标头(如果它与之前的 针对给定来源看到的数据在 Chrome 中,这会导致控制台警告。

这种一致性的适用范围为浏览上下文组,即一组标签页、窗口或 所有 iframe 都可以通过 window.openerframes[0]window.parent。这表示,一旦来源的源或网站键确定(由 标头),更改它需要打开一个全新的 并且不以任何方式连接到旧版本

这些详细信息对于测试 Origin-Agent-Cluster 头文件非常重要。首次添加时 重定向到您的网站,直接重新加载页面不会起作用;则需要关闭该标签页 一个。

如需检查是否应用了 Origin-Agent-Cluster 标头,请使用 JavaScript window.originAgentCluster 属性。如果标头(或其他true 机制(例如跨域隔离)导致了源密钥;false 实际数据在未实现 Origin-Agent-Cluster 标头的浏览器中使用 undefined。 将这些数据记录到分析平台后,可以进行有价值的检查,确认您已配置 您的服务器。

最后,请注意 Origin-Agent-Cluster 标头仅适用于 secure 上下文,即在 HTTPS 上 或 http://localhost。非 localhost HTTP 页面不支持以源为键的代理 集群。

源键不是安全功能

虽然使用以源为键的代理集群确实可以将您的源与 那么对于同网站跨源网页,它无法提供以下保护: 与安全相关的标头 Cross-Origin-Resource-PolicyCross-Origin-Opener-Policy。 具体而言,它对于防范边信道攻击(如 Spectre

这可能有点意外,因为源键有时会导致您的源拥有自己的 进程和独立进程是防范边信道攻击的重要防御手段。但请注意 Origin-Agent-Cluster 标头只是这方面的提示。该浏览器位于 的义务为来源提供单独的流程,而未这样做的原因可能有多种:

  • 浏览器可能未实现执行此操作的技术。例如,目前 Safari 和 Firefox 可以将单独的标签页放入自己的进程中,但还不能对 iframe 这样做。

  • 浏览器可能会认为不值得单独进程的开销。例如,在 内存不足的 Android 设备或在 Android WebView 中,Chrome 会尽可能少地使用进程。

  • 浏览器可能需要遵循 Origin-Agent-Cluster 标头指示的请求, 但可以使用与进程不同的隔离技术来实现这一目的。例如,Chrome 是 探索 使用线程(而非进程)来实现这种性能隔离。

  • 用户或在其他网站上运行的代码可能已经导航到以网站为键的网页 ,这会导致一致性保证生效, Origin-Agent-Cluster 标头。

因此,请务必不要将以源为键的代理集群视为安全功能。 而是一种帮助浏览器确定资源分配的优先级的方法,它会提示 (而您愿意放弃某些 功能来交换价值。

反馈

如果您正在使用或考虑使用 Origin-Agent-Cluster,Chrome 团队希望能收到您的反馈。 标头。您的公共利益和支持有助于我们优先推出功能,并显示其他 浏览器供应商的重要性在 @ChromiumDev 上发推文和 让 Chrome DevRel 了解您的想法和体验。

如果您对规范或该功能的工作方式有其他疑问, 在 HTML 标准 GitHub 代码库中提交问题。如果您 遇到任何与 Chrome 实现有关的问题,可以提交错误报告,请访问 new.crbug.com “组件”字段设置为 Internals>Sandbox>SiteIsolation

了解详情

如需详细了解以源为键的代理集群,您可以访问以下链接了解详情: