将 Wasm 模块共享限制为同源

在同一网站环境之间共享 WebAssembly 模块将仅限于同源。

我们将弃用在同站但跨源环境之间共享 WebAssembly (Wasm) 模块的功能,以便长期将代理集群的范围限定为来源。以这种方式使用 Wasm 模块的开发者必须确保在同源中实例化这些模块,才能在 Chrome 95 之后继续使用它们。

Wasm 模块是什么以及它们的运作方式

WebAssembly 程序会被组织成模块,模块是部署、加载和编译的单位。

在以下示例代码中,从 https://iframe.site.example 导入的 Wasm 模块会通过 postMessage()https://main.site.example 共享。请注意,这些网域是同一网站但跨源

https://iframe.site.example 上的 Wasm 模块:

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

从 Chrome 95 开始,发送方和接收方必须来自同一源。在上述情况下,https://iframe.site.example 需要为 https://main.site.example,反之亦然。

为何需要这样做

Chrome 一直在内部处理基于网站键的代理集群中的不同文档、标签页和框架。这意味着,同源文档在同一进程中处理(具体运作方式因浏览器而异)。最近,Chrome 开始以更精细的单元(来源)来处理它们。我们将其称为以源为键的代理集群。不过,由于这样做会耗费大量资源,因此我们仅以启发法将基于来源的代理集群应用于少数网站。

我们的计划是默认将所有代理集群都设为以源为键。为此,我们需要限制需要使用网站键的源代码集群的功能:

解决上述所有更改后,Chrome 将默认改用以源代码为键的代理集群。

如需详细了解以源为键的代理集群,请参阅使用 Origin-Agent-Cluster 标头请求性能隔离

后续步骤和资源

为了让 Chrome 默认与基于来源的代理集群搭配使用,我们将 document.domain 设为只读。Chrome 团队计划于 2022 年某个时间推出这项变更。

照片由 Markus Winkler 拍摄,选自 Unsplash