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á al mismo origen.

Compartir un módulo de WebAssembly (Wasm) entre entornos de mismo sitio pero de origen cruzado dejará de estar disponible para permitir que los clústeres de agentes tengan alcance en los orígenes a largo plazo. Los desarrolladores que usan módulos Wasm de tal manera deben asegurarse de crear una instancia de esos módulos en el mismo origen para seguir usándolos 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 implementación, carga y compilación.

En el siguiente código de ejemplo, un módulo de Wasm importado 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 ser del mismo origen. En el caso anterior, https://iframe.site.example debe ser https://main.site.example o viceversa.

Por qué esto es necesario

Chrome maneja de forma interna diferentes documentos, pestañas y marcos en clústeres de agentes con clave de sitio. Esto significa que los documentos del mismo sitio se controlan dentro del mismo proceso (la precisión de este funcionamiento varía según el navegador). Hace poco, Chrome comenzó a controlarlos en unidades más precisas: los orígenes. Los 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 manera heurística.

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

  • (Solo para Chrome) Ya no puedes enviar objetos SharedArrayBuffer ni WebAssembly.Memory a otras páginas de origen cruzado del mismo sitio. Esto ya está vigente desde Chrome 92.
  • Ya no puedes enviar objetos WebAssembly.Module a otras páginas de origen cruzado del mismo sitio a través de postMessage(). Este cambio se explica con más detalle a continuación.
  • Ya no puedes configurar document.domain. Esta es una función heredada que, por lo general, permite que las páginas de origen cruzado en el mismo sitio accedan de forma síncrona al DOM del otro, pero está inhabilitada en los clústeres de agentes con clave de origen.

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

Para obtener más información sobre los clústeres de agentes con clave de origen, consulta Solicita el 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, haremos que document.domain sea de solo lectura. El equipo de Chrome pretende implementar este cambio en algún momento de 2022.

Foto de Markus Winkler en Unsplash