Restringiendo el uso compartido del módulo de Wasm a same-origin

Compartir un módulo de WebAssembly entre entornos del mismo sitio se restringirá solo al mismo origen.

Compartir un módulo de WebAssembly (Wasm) entre entornos del mismo sitio pero de origen cruzado será obsoleto para permitir clústeres de agentes a los orígenes a largo plazo. Los desarrolladores que usan módulos de Wasm en una forma debe asegurarse de crear una instancia de esos módulos en el mismo origen para continuar usarlas después de Chrome 95.

Qué son los módulos de Wasm y cómo funcionan

Los programas de WebAssembly se organizan en módulos, que son la unidad de la implementación, la carga y la compilación.

En el siguiente código de ejemplo, se importó un módulo de Wasm desde https://iframe.site.example se comparte con https://main.site.example a través de postMessage() Ten en cuenta que estos dominios son del mismo sitio, pero de origen cruzado.

Módulo de Wasm en https://iframe.site.example:

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

A partir de Chrome 95, el remitente y el destinatario deben tener el mismo origen. En en el caso anterior, https://iframe.site.example debe https://main.site.example o viceversa.

Por qué es necesario

Chrome ha estado manejando internamente diferentes documentos, pestañas y marcos en con clave de sitio. Esto significa que los documentos en el mismo sitio se manejan el mismo proceso (la manera exacta en que funciona varía según el navegador). Recientemente, Chrome empezamos a manejarlos en unidades más detalladas: orígenes. Lo llamamos clústeres de agentes con clave de origen. Sin embargo, debido a que hacerlo es costoso en términos de recursos, Los clústeres de agentes con clave de origen se aplicaron solo a sitios web limitados de forma heurística.

El plan es hacer que todos los clústeres de agentes tengan clave de origen de forma predeterminada. Para para lograrlo, debemos restringir las capacidades que requieren claves de sitio clústeres de origen:

  • (solo para Chrome) Ya no puedes enviar SharedArrayBuffer o WebAssembly.Memory a otras páginas de origen cruzado del mismo sitio. Esta opción ya está implementada desde Chrome 92.
  • Ya no puedes enviar WebAssembly.Module objetos a otras páginas de origen cruzado del mismo sitio mediante postMessage(). Este cambio se explica con más detalle a continuación.
  • Ya no puedes establecer document.domain Esta es una función heredada que, por lo general, permite que las páginas de origen cruzado del mismo sitio pueden acceder de forma síncrona a los DOM de los demás, pero, en los clústeres de agentes con clave de origen, está inhabilitada.

Si se abordan todos los cambios anteriores, Chrome comenzará a usar un agente con clave de origen. clústeres de forma predeterminada.

Para obtener más información sobre los clústeres de agentes con clave de origen, consulta Solicita aislamiento de rendimiento con el encabezado Origin-Agent-Cluster.

Pasos siguientes y recursos

Para que Chrome funcione con clústeres de agentes con clave de origen de forma predeterminada, hacer que document.domain sea de solo lectura. El equipo de Chrome intenta lograr este cambio. en algún momento del 2022.

Foto de Markus Winkler activado Eliminar salpicaduras