Limitazione della condivisione dei moduli Wasm alla stessa origine

La condivisione di un modulo WebAssembly tra ambienti dello stesso sito sarà limitata solo all'origine.

La condivisione di un modulo WebAssembly (Wasm) tra ambienti nello stesso sito, ma di origini diverse verrà ritirata per consentire di applicare l'ambito dei cluster di agenti alle origini a lungo termine. Gli sviluppatori che utilizzano i moduli Wasm in questo modo devono assicurarsi di eseguirne l'inizializzazione nella stessa origine per continuare a utilizzarli dopo Chrome 95.

Che cosa sono i moduli Wasm e come funzionano

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

Nell'esempio di codice seguente, un modulo Wasm importato da https://iframe.site.example viene condiviso con https://main.site.example tramite postMessage(). Tieni presente che questi domini sono nello stesso sito, ma di origini diverse.

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 o viceversa.

Perché è necessario

Chrome gestisce internamente diversi documenti, schede e frame su cluster di agenti basati su chiavi del sito. Ciò significa che i documenti dello stesso sito vengono gestiti all'interno della stessa procedura (il funzionamento esatto varia in base al browser). Di recente, Chrome ha iniziato a gestirle in unità più granulari: le origini. Li chiamiamo cluster di agenti in base all'origine. Tuttavia, poiché questa operazione richiede molte risorse, i cluster di agenti in base all'origine sono stati applicati in modo euristico solo a siti web limitati.

Il piano è rendere tutti i cluster di agenti basati su origini per impostazione predefinita. Per farlo, dobbiamo limitare le funzionalità che richiedono cluster di origine basati su chiave del sito:

  • (Solo Chrome) Non puoi più inviare oggetti SharedArrayBuffer o WebAssembly.Memory ad altre pagine cross-origin nello stesso sito. Questa funzionalità è già in uso da Chrome 92.
  • Non puoi più inviare oggetti WebAssembly.Module ad altre pagine cross-origin nello stesso sito tramite postMessage(). Questa modifica è spiegata in maggiore dettaglio di seguito.
  • Non puoi più impostare document.domain. Si tratta di una funzionalità precedente che in genere consente alle pagine multiorigine dello stesso sito di accedere in modo sincrono al DOM l'una all'altra, ma nei cluster di agenti con chiave di origine è disattivata.

Se vengono applicate tutte le modifiche sopra indicate, Chrome passerà a utilizzare i cluster di agenti basati sull'origine per impostazione predefinita.

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

Passaggi successivi e risorse

Per fare in modo che Chrome funzioni per impostazione predefinita con i cluster di agenti basati su origini, imposteremo document.domain come di sola lettura. Il team di Chrome intende implementare questa modifica in qualche momento nel 2022.

Foto di Markus Winkler su Unsplash