将 Wasm 模块共享限制为同源

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

同网站但跨源环境之间共享 WebAssembly (Wasm) 模块 已废弃,以允许代理集群 从长远来看,将范围限定为源站。使用 Wasm 模块 一种方式必须确保在同源实例化这些模块才能继续 在 Chrome 95 之后使用这些版本。

什么是 Wasm 模块及其工作原理

WebAssembly 程序会整理成模块,这些模块是 部署、加载和编译。

在下面的示例代码中,从 https://iframe.site.example 是通过以下途径与 https://main.site.example 共享的: postMessage()。请注意,这些网域是同网站但跨源的。

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 起便已采用
  • 您无法再发送 WebAssembly.Module 对象通过 postMessage() 传递给其他同网站跨源网页。此更改 下文进行了更详细的说明。
  • 您无法再设置 document.domain。 这是一项旧版功能,通常允许同网站跨源网页 可以同步访问彼此的 DOM,但在以源为键的代理集群中, 已停用。

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

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

后续步骤和资源

为了让 Chrome 默认使用以源为键的代理集群, 将 document.domain 设为只读。Chrome 团队力求实现这一变更 。

摄影:Markus Winkler 已开启 不启动