Limitazione della condivisione dei moduli Wasm alla stessa origine

La condivisione di un modulo WebAssembly tra ambienti dello stesso sito verrà limitata solo alla stessa origine.

La condivisione di un modulo WebAssembly (Wasm) tra ambienti stesso sito e multiorigine verrà ritirata per consentire ai cluster di agenti di limitare l'ambito alle origini a lungo termine. Gli sviluppatori che usano i moduli Wasm in questo modo devono assicurarsi di creare un'istanza dei moduli nella stessa origine per continuare a utilizzarli dopo Chrome 95.

Cosa sono i moduli Wasm e come funzionano

I programmi WebAssembly sono organizzati in moduli, che sono l'unità di deployment, caricamento e compilazione.

Nel codice di esempio seguente, un modulo Wasm importato da https://iframe.site.example viene condiviso con https://main.site.example tramite postMessage(). Nota che questi domini sono stesso sito ma multiorigine.

Modulo Wasm su https://iframe.site.example:

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

A partire da Chrome 95, il mittente e il destinatario devono avere la stessa origine. Nel caso precedente, https://iframe.site.example deve essere https://main.site.example e viceversa.

Perché è necessario

Chrome gestisce internamente diversi documenti, schede e frame su cluster di agenti in base al sito. Ciò significa che i documenti dello stesso sito vengono gestiti all'interno dello stesso processo (il funzionamento esatto varia a seconda del browser). Di recente, Chrome ha iniziato a gestirle in unità più granulari: le origini. Definiamo questi dati cluster di agenti in base all'origine. Tuttavia, poiché questa operazione è costosa, i cluster di agenti in base all'origine sono stati applicati euristicamente solo a siti web limitati.

Il piano prevede di rendere tutti i cluster di agenti in chiave di origine per impostazione predefinita. A questo scopo, dobbiamo limitare le funzionalità che richiedono cluster di origine con chiave del sito:

  • (Solo per Chrome) Non puoi più inviare oggetti SharedArrayBuffer o WebAssembly.Memory ad altre pagine multiorigine dello stesso sito. È già attivo da Chrome 92.
  • Non puoi più inviare oggetti WebAssembly.Module ad altre pagine multiorigine dello stesso sito tramite postMessage(). Questa modifica è spiegata più dettagliatamente di seguito.
  • Non puoi più impostare document.domain. Questa è una funzionalità legacy che normalmente consente alle pagine multiorigine dello stesso sito di accedere in modo sincrono al DOM dell'altro, ma nei cluster di agenti con chiave di origine viene disattivata.

Se risolvi tutte le modifiche precedenti, Chrome passerà a utilizzare i cluster di agenti in base all'origine per impostazione predefinita.

Per scoprire di più sui cluster di agenti in base all'origine, consulta Richiesta di isolamento delle prestazioni con l'intestazione Origin-Agent-Cluster.

Passaggi successivi e risorse

Per far funzionare Chrome con cluster di agenti in base all'origine per impostazione predefinita, renderemo document.domain di sola lettura. Il team di Chrome punta ad applicare questo cambiamento nel 2022.

Foto di Markus Winkler su Unsplash