使用 COEP 无凭据加载不含 CORP 标头的跨源资源

第三方提供的跨源资源通常不包含足够的 CORP 标头。如果可以在没有凭据的情况下请求这些密钥,那么现在您可以通过添加这类凭据来启用跨域隔离。

我们推出了新的跨域嵌入器政策 (COEP) 值 credentialless,它允许浏览器通过发送不含凭据(例如 Cookie)的请求来加载不使用跨域资源政策 (CORP) 的跨源资源。这有助于开发者更轻松地采用跨域隔离。

为什么需要跨域隔离

某些 Web API 会增加旁路攻击的风险,例如 Spectre。为了降低这种风险,浏览器提供了一种基于选择启用的隔离环境,称为跨域隔离。在跨域隔离状态下,网页可以使用特权功能,包括 SharedArrayBufferperformance.measureUserAgentSpecificMemory()分辨率更高的高精度计时器,同时将源站与其他来源隔离开来(除非它们选择启用)。

要启用跨域隔离,网页必须发送两个 HTTP 标头:

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

在跨域隔离状态下,所有跨源资源都必须使用 CORS 提供,或设置要加载的 Cross-Origin-Resource-Policy 标头。

启用跨域隔离的挑战

虽然跨域隔离能够为网页带来更好的安全性,并且能够实现强大的功能,但其部署过程可能非常困难。其中最大的挑战之一是要求为所有跨源资源启用 CORS 或 CORP。浏览器不会在跨源隔离页面上加载没有这些标头的资源。

这些跨源资源通常由第三方提供,这些第三方可能很难为其添加必要的标头。

但是,如果我们知道资源足够安全,可以加载它呢?事实上,只有使用凭据请求的资源才面临风险,因为它们可能包含攻击者无法自行加载的敏感信息。这意味着,无需凭据即可请求的资源是公开可用的资源,可以安全加载。

救援 credentialless

这时,COEP: credentialless 就可以派上用场了。credentiallessCross-Origin-Embedder-Policy 标头的新值。与 require-corp 类似,它可以启用跨域隔离,但无凭据跨域请求无需 CORP:cross-origin 标头,而是在没有凭据(例如 Cookie)的情况下发送。

您也可以使用以下两个标头启用跨域隔离:

Cross-Origin-Embedder-Policy: credentialless
Cross-Origin-Opener-Policy: same-origin

这意味着请求的跨源服务器无法响应敏感资源,并且请求者始终可以假定响应仅包含公开信息。

这与浏览器逐步停用第三方 Cookie 的计划一致。

演示

您可以在以下演示中试用各种标头选项:https://cross-origin-isolation.glitch.me

常见问题解答

我可以在 credentialless 环境下发送存储了凭据的请求吗?

当然,您需要更改请求的模式,要求对响应进行 CORS 检查。对于 <audio><img><link><script><video> 等 HTML 标记,只需明确附加 crossorigin="use-credentials" 即可告知浏览器发送基于凭据的请求。

例如,即使 https://www.example.com 上的文档具有 Cross-Origin-Embedder-Policy: credentialless 标头,<img src="https://images.example.com/avatar.png" crossorigin="use-credentials"> 也会发送一个存储了凭据的请求。

对于 fetch() API,可以使用 request.mode = 'cors'

提供了 COEP: credentialless,那么 COEP: require-corp 对我的网站是否有用?

如果某些跨源子资源需要 Cookie,则 COEP: require-corp 不要求您手动将请求模式切换为 CORS。

credentialless 环境下,能否加载没有特殊标头的跨源 iframe?

不可以。在 credentialless 环境下加载跨源 iframe 仍然需要与 require-corp 相同的条件。iframe 文档需要使用两个标头提供:

  • Cross-Origin-Embedder-Policy: credentialless(或 require-corp
  • Cross-Origin-Resource-Policy: cross-origin

好消息是,目前正在讨论如何通过为 iframe 指定 crossorigin="anonymous" 来允许加载不含这些标头的跨源 iframe。这将允许在没有标头但没有凭据的情况下加载跨源 iframe。

其他浏览器会采用此功能吗?

即将推出的功能

我们还将发布两项更新,以缓解与跨域隔离相关的其他挑战:

受上述障碍影响的 Chrome 源试用以延长 SharedArrayBuffer 变更时间的用户可能会想知道这项计划何时会终止。我们最初曾宣布会在 Chrome 96 中终止此功能,但我们已决定将其推迟到 Chrome 106。

资源

照片由 Martin Adams 拍摄,来源:Unsplash