将 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)您无法再将 SharedArrayBufferWebAssembly.Memory 对象发送到其他同网站跨源网页。这项功能从 Chrome 92 开始就已引入
  • 您无法再通过 postMessage()WebAssembly.Module 对象发送到其他同网站跨源网页。下面更详细地介绍了这项变更。
  • 您无法再设置 document.domain。这是一项旧版功能,通常允许同网站跨源网页同步访问彼此的 DOM,但在以源为键的代理集群中,此功能处于停用状态。

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

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

后续步骤和资源

为了使 Chrome 默认使用以源为键的代理集群,我们会将 document.domain 设为只读。Chrome 团队计划在 2022 年的某个时候落实这项变更。

照片由 Markus Winkler 拍摄,拍摄于 Unsplash 用户