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

O compartilhamento de um módulo do WebAssembly entre ambientes do mesmo site será restrito apenas a origens iguais.

O compartilhamento de um módulo do WebAssembly (Wasm) entre ambientes no mesmo site, mas com origem cruzada será descontinuado para permitir que os clusters de agentes sejam aplicados a origens a longo prazo. Os desenvolvedores que usam módulos Wasm dessa forma precisam garantir que esses módulos sejam instanciados na mesma origem para continuar usando-os após o Chrome 95.

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

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

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

Módulo Wasm no 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 receptor 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 estava processando internamente documentos, guias e frames diferentes em clusters de agentes com chave de site. Isso significa que os documentos do mesmo site são processados no mesmo processo (como exatamente isso funciona varia de acordo com o navegador). Recentemente, o Chrome começou a processá-los em unidades mais detalhadas: origens. Chamamos isso de clusters de agente com chave de origem. No entanto, como isso consome muitos recursos, os clusters de agentes com chave de origem foram aplicados apenas a sites limitados de forma heurística.

O plano é fazer com que todos os clusters de agentes tenham uma origin-key por padrão. Para fazer isso, precisamos restringir os recursos que exigem clusters de origem com chave de site:

  • (Somente 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 entre origens do mesmo site usando 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 entre origens do mesmo site acessem o DOM umas das outras de forma síncrona, mas em clusters de agentes com chave de origem, ele é desativado.

Ao abordar todas as mudanças acima, o Chrome vai passar a usar clusters de agentes com chave de origem por padrão.

Para saber mais sobre clusters de agentes com chave de origem, consulte Solicitar isolamento de desempenho com o cabeçalho Origin-Agent-Cluster.

Próximas etapas e recursos

Para que o Chrome funcione com clusters de agentes com chave de origem por padrão, vamos tornar document.domain somente leitura. A equipe do Chrome pretende lançar essa mudança em algum momento de 2022.

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