Como restringir o compartilhamento do módulo Wasm para a mesma origem

O compartilhamento de um módulo WebAssembly entre ambientes com o mesmo site será restrito à mesma origem.

O compartilhamento de um módulo WebAssembly (Wasm) entre ambientes com o mesmo site, mas de origem cruzada será descontinuado para permitir que os clusters de agente tenham escopo de origens a longo prazo. Os desenvolvedores que usam módulos Wasm dessa forma precisam instanciar esses módulos na mesma origem para continuar a usá-los após o Chrome 95.

O que são os módulos Wasm e como eles funcionam

Os programas WebAssembly são organizados em módulos, que são a unidade de implantação, carregamento e compilação.

No código de exemplo abaixo, um módulo Wasm importado de https://iframe.site.example é compartilhado com https://main.site.example usando postMessage(). Esses domínios são do mesmo site, mas de origem cruzada.

Módulo do Wasm em https://iframe.site.example:

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

A partir do Chrome 95, o remetente e o destinatário precisam ter a mesma origem. No caso acima, https://iframe.site.example precisa ser https://main.site.example ou vice-versa.

Por que isso é necessário

O Chrome lida internamente com diferentes documentos, guias e frames em clusters de agente com site-key. Isso significa que documentos do mesmo site são tratados no mesmo processo. O funcionamento exato varia de acordo com o navegador. Recentemente, o Chrome começou a lidar com eles em unidades mais refinadas: as origens. Chamamos isso de clusters de agente com origin-key. No entanto, como isso custa muitos recursos, os clusters de agente com origin-key eram aplicados apenas a sites limitados de forma heurística.

O plano é tornar todos os clusters de agente com origin-key por padrão. Para isso, precisamos restringir os recursos que exigem clusters de origem inseridos no site:

  • (Apenas no Chrome) Não é mais possível enviar objetos SharedArrayBuffer ou WebAssembly.Memory para outras páginas de origem cruzada no mesmo site. Isso já está em vigor desde o Chrome 92.
  • Não é mais possível enviar objetos WebAssembly.Module para outras páginas de origem cruzada no mesmo site via postMessage(). Essa mudança é explicada com mais detalhes abaixo.
  • Não é mais possível definir document.domain. Esse é um recurso legado que normalmente permite que páginas de origem cruzada do mesmo site acessem de maneira síncrona o DOM umas das outras, mas, em clusters de agente com origin-key, ele é desativado.

Ao lidar com todas as alterações acima, o Chrome passará a usar clusters de agente com origin-key por padrão.

Para saber mais sobre clusters de agente com origin-key, consulte Como solicitar isolamento de desempenho com o cabeçalho Origin-Agent-Cluster.

Próximas etapas e recursos

Para que o Chrome funcione com clusters de agente com origin-key por padrão, tornaremos document.domain somente leitura. A equipe do Chrome pretende implementar essa mudança em 2022.

Foto de Markus Winkler no Unsplash (links em inglês)