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

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

El uso compartido de 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 se asignen a orígenes a largo plazo. Los desarrolladores que usan módulos de Wasm de esa manera deben asegurarse de crear una instancia de esos módulos en el mismo origen para continuar 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, se comparte un módulo Wasm importado desde https://iframe.site.example con https://main.site.example a través de postMessage(). Observa que estos dominios son del mismo sitio, pero de origen diferente.

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 el caso anterior, https://iframe.site.example debe ser https://main.site.example o viceversa.

Por qué es necesario

Chrome controlaba de forma interna diferentes documentos, pestañas y marcos en clústeres de agentes con claves de sitios. Esto significa que los documentos del mismo sitio se controlan dentro del mismo proceso (el funcionamiento exacto varía según el navegador). Recientemente, Chrome comenzó a manejarlos en unidades más detalladas: orígenes. Lo llamamos agrupamientos de agentes con clave de origen. Sin embargo, como hacerlo es costoso en términos de recursos, los clústeres de agentes con clave de origen solo se aplicaron de forma heurística a sitios web limitados.

El plan es hacer que todos los clústeres de agentes tengan clave de origen de forma predeterminada. Para lograr esto, debemos restringir las capacidades que requieren clústeres de origen con claves de sitios:

  • (Solo para Chrome) Ya no puedes enviar objetos SharedArrayBuffer ni WebAssembly.Memory a otras páginas de origen cruzado en el mismo sitio. Esta opción ya está implementada desde Chrome 92.
  • Ya no puedes enviar objetos WebAssembly.Module a otras páginas de origen cruzado en el 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 de cada una, pero en los clústeres de agentes con clave de origen, está inhabilitada.

Si abordas 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 Cómo solicitar 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 busca implementar este cambio en algún momento de 2022.

Foto de Markus Winkler en Unsplash