跳转到主要内容

category

使用COOP和COEP来建立一个跨原点的隔离环境,并以更好的精度启用强大的功能,如SharedArray Buffer、performance.measureUserAgentSpecificMemory()和高分辨率计时器。


注意:Chrome桌面上的SharedArrayBuffer需要从Chrome 92开始进行跨源隔离。在Android Chrome 88和Desktop Chrome 92中的SharedArray Buffer更新中了解更多信息。

更新

  • 2022年6月21日:启用跨源隔离时,工作脚本也需要小心。添加了一些解释。
  • 2021年8月5日:JS Self-Profiling API被提到是需要交叉源隔离的API之一,但反映了最近方向的变化,它被删除了。
  • 2021年5月6日:根据反馈和报告的问题,我们决定调整在Chrome M92中限制非跨源隔离站点中使用SharedArray Buffer的时间表。
  • 2021年4月16日:添加了关于新的COEP无证书模式和COOP同源的注释,允许弹出窗口成为跨源隔离的放松条件。
  • 2021年3月5日:删除了SharedArray Buffer、performance.measureUserAgentSpecificMemory()和调试功能的限制,这些功能现在已在Chrome 89中完全启用。添加了即将推出的功能performance.now()和performance.timeOrigin,它们将具有更高的精度。
  • 2021年2月19日:添加了关于功能策略allow=“跨源隔离”和DevTools上调试功能的说明。
  • 2020年10月15日:self.crossOriginIsolated可从Chrome 87获得。反映这一点的是,当self.crossOriginIsolated返回true时,document.domain是不可变的。performance.measureUserAgentSpecificMemory()正在结束其原始试用,并且在Chrome 89中默认启用。Android Chrome上的共享数组缓冲区将从Chrome 88开始提供。

一些web API增加了像Spectre这样的侧通道攻击的风险。为了降低这种风险,浏览器提供了一个基于选择加入的隔离环境,称为跨源隔离。在跨来源隔离状态下,网页将能够使用特权功能,包括:

 

API Description
SharedArrayBuffer Required for WebAssembly threads. This is available from Android Chrome 88. Desktop version is currently enabled by default with the help of Site Isolation, but will require the cross-origin isolated state and will be disabled by default in Chrome 92.
performance.measureUserAgentSpecificMemory() Available from Chrome 89.
performance.now()performance.timeOrigin Currently available in many browsers with the resolution limited to 100 microseconds or higher. With cross-origin isolation, the resolution can be 5 microseconds or higher.
Features that will be available behind cross-origin isolated state.

跨原点隔离状态还防止修改document.domain。(能够更改文档.domain允许在同一站点文档之间进行通信,这被认为是同源政策中的一个漏洞。)

要选择进入跨源隔离状态,您需要在主文档上发送以下HTTP标头:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin


这些标题指示浏览器阻止加载未选择由跨来源文档加载的资源或iframe,并阻止跨来源窗口与您的文档直接交互。这也意味着那些跨来源加载的资源需要选择加入。

您可以通过检查self.crossOriginIsolated来确定网页是否处于跨原点隔离状态。

本文展示了如何使用这些新标头。在后续文章中,我将提供更多的背景和背景。

注意:本文针对的是那些希望在浏览器平台上以更稳健的方式使用SharedArray Buffer、WebAssembly线程、performance.measureUserAgentSpecificMemory()或高精度计时器的网站。


关键词:这篇文章使用了许多听起来相似的术语。为了让事情更清楚,让我们先定义它们:*COEP:跨来源嵌入器策略*COOP:跨来源开放器策略*CORP:跨起源资源策略*CORS:跨来源资源共享*CORB:跨来源读取阻塞


部署COOP和COEP,使您的网站跨源隔离


注意:在启用跨源隔离指南中学习启用跨源分离的实用步骤。

集成COOP和COEP


1.设置跨来源Opener策略:在顶层文档上设置同源头


通过在顶级文档上启用 COOP: same-origin,具有相同原点的窗口和从文档打开的窗口将具有单独的浏览上下文组,除非它们位于相同原点且具有相同的COOP设置。因此,对打开的窗口强制隔离,并禁用两个窗口之间的相互通信。

注意:这将破坏需要跨来源窗口交互(如OAuth和支付)的集成。为了缓解这个问题,我们正在探索放宽条件,使跨来源隔离成为跨来源开放者政策:同源允许弹出窗口。通过这种方式,可以与自己打开的窗口进行通信。如果您想启用跨来源隔离,但被此问题阻止,我们建议您注册来源试验,并等待新条件可用。在这个问题得到安全解决之前,我们不打算终止原产地试验。


浏览上下文组是一组可以相互引用的窗口。例如,通过<iframe>嵌入的顶级文档及其子文档。如果是网站(https://a.example)打开一个弹出窗口(https://b.example),打开窗口和弹出窗口共享相同的浏览上下文,因此它们可以通过window.opener等DOM API相互访问。