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

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

O compartilhamento de um módulo WebAssembly (Wasm) entre ambientes com o mesmo site, mas com origem cruzada, será descontinuada para permitir clusters de agente no escopo das origens de longo prazo. Os desenvolvedores que usam módulos Wasm em tais uma maneira de ter certeza de instanciar esses módulos na mesma origem para continuar depois do Chrome 95.

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

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

No código de exemplo a seguir, um módulo Wasm importado de https://iframe.site.example foi compartilhado com https://main.site.example via postMessage() Observe que esses domínios têm o mesmo site, mas têm origem cruzada.

Módulo 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. Em no caso acima, https://iframe.site.example precisa ser https://main.site.example ou vice-versa.

Por que isso é necessário

O Chrome vem lidando internamente com diferentes documentos, guias e frames clusters de agente com site-key. Isso significa que os documentos do mesmo site são tratados dentro o mesmo processo (a maneira exata como isso funciona varia de acordo com o navegador). Recentemente, o Chrome e começamos a lidar com eles em unidades mais refinadas: origens. Nós os chamamos clusters de agente com origin-key. No entanto, como os recursos são caros, os clusters de agente com origin-key foram aplicados de forma heurística apenas em alguns sites.

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

  • (somente no Chrome) Não é mais possível enviar SharedArrayBuffer ou WebAssembly.Memory a outras páginas de origem cruzada no mesmo site. Isso já está em vigor desde o Chrome 92.
  • Não é mais possível enviar WebAssembly.Module objetos para outras páginas de origem cruzada no mesmo site via postMessage(). Essa mudança é explicado 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 forma síncrona o DOM uns dos outros, mas, nos clusters de agente com origin-key, está desativado.

Ao resolver todas as mudanças acima, o Chrome passará a usar o agente com origin-key clusters 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, vamos tornar document.domain somente leitura. O objetivo da equipe do Chrome é promover essa mudança. em algum momento em 2022.

Foto de Markus Winkler ativado Abrir