Het delen van Wasm-modules beperken tot dezelfde oorsprong

Het delen van een WebAssembly-module tussen omgevingen op dezelfde site is beperkt tot dezelfde bron.

Het delen van een WebAssembly-module (Wasm) tussen omgevingen op dezelfde site maar met meerdere bronnen wordt afgeschaft, zodat agentclusters op lange termijn kunnen worden getarget op de oorsprong. Ontwikkelaars die Wasm-modules op een dergelijke manier gebruiken, moeten ervoor zorgen dat deze modules op dezelfde oorsprong worden geïnstantieerd om ze na Chrome 95 te kunnen blijven gebruiken.

Wat zijn Wasm-modules en hoe ze werken

WebAssembly-programma's zijn georganiseerd in modules, die de eenheid vormen voor implementatie, laden en compilatie.

In de volgende voorbeeldcode wordt een Wasm-module geïmporteerd uit https://iframe.site.example gedeeld met https://main.site.example via postMessage() . Merk op dat deze domeinen dezelfde site hebben, maar cross-origineel zijn .

Wasm-module op https://iframe.site.example :

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

Vanaf Chrome 95 moeten de afzender en de ontvanger van dezelfde oorsprong zijn. In het bovenstaande geval moet https://iframe.site.example https://main.site.example zijn of andersom.

Waarom dit nodig is

Chrome verwerkt intern verschillende documenten, tabbladen en frames op site-keyed agentclusters. Dit betekent dat documenten van dezelfde site binnen hetzelfde proces worden afgehandeld (hoe dit precies werkt, verschilt per browser). Onlangs begon Chrome ze in meer fijnkorrelige eenheden te verwerken: oorsprong. We noemen dit 'oorsprong-gesleutelde agentclusters' . Omdat dit echter kostbaar is, werden agentclusters met een oorsprongsleutel heuristisch alleen op een beperkt aantal websites toegepast.

Het plan is om alle agentclusters standaard een oorsprongssleutel te geven. Om dit te bereiken moeten we de mogelijkheden beperken die site-keyed origin clusters vereisen:

  • (Alleen Chrome) U kunt SharedArrayBuffer of WebAssembly.Memory objecten niet langer verzenden naar andere cross-origin-pagina's van dezelfde site. Dit bestaat al sinds Chrome 92 .
  • U kunt geen WebAssembly.Module objecten meer verzenden naar andere cross-origin-pagina's van dezelfde site via postMessage() . Deze wijziging wordt hieronder nader toegelicht.
  • U kunt document.domain niet langer instellen. Dit is een verouderde functie waarmee cross-origin-pagina's van dezelfde site normaal gesproken synchroon toegang krijgen tot elkaars DOM, maar in agentclusters met een origin-sleutel is deze functie uitgeschakeld.

Door alle bovenstaande wijzigingen aan te pakken, gaat Chrome standaard agentclusters met een oorsprongsleutel gebruiken.

Zie Prestatie-isolatie aanvragen met de header Origin-Agent-Cluster voor meer informatie over agentclusters met een origin-key.

Volgende stappen en bronnen

Om ervoor te zorgen dat Chrome standaard werkt met agentclusters met een origin-key, maken we document.domain alleen-lezen. Het Chrome-team streeft ernaar deze verandering ergens in 2022 door te voeren.

Foto door Markus Winkler op Unsplash