Het delen van Wasm-modules beperken tot dezelfde oorsprong

Het delen van een WebAssembly-module tussen omgevingen met dezelfde site is beperkt tot omgevingen met dezelfde oorsprong.

Het delen van een WebAssembly (Wasm)-module tussen omgevingen met dezelfde site maar met verschillende oorsprongen wordt afgeschaft, zodat agentclusters op lange termijn aan oorsprongen kunnen worden gekoppeld. Ontwikkelaars die Wasm-modules op deze manier gebruiken, moeten ervoor zorgen dat ze deze modules op dezelfde oorsprong instantiëren om ze ook na Chrome 95 te kunnen blijven gebruiken.

Wat zijn Wasm-modules en hoe werken ze?

WebAssembly-programma's zijn georganiseerd in modules. Deze modules zijn de eenheden voor implementatie, laden en compileren.

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

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 verzender en de ontvanger dezelfde oorsprong hebben. In bovenstaand geval moet https://iframe.site.example https://main.site.example worden 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 verwerkt (hoe dit precies werkt, verschilt per browser). Sinds kort verwerkt Chrome deze in meer gedetailleerde eenheden: oorsprongen. We noemen dit oorsprong-keyed agentclusters . Omdat dit echter veel resources kost, werden oorsprong-keyed agentclusters slechts heuristisch toegepast op een beperkt aantal websites.

Het plan is om alle agentclusters standaard een oorsprongssleutel te geven. Om dit te bereiken, moeten we de mogelijkheden beperken die locatiegebonden oorsprongsclusters vereisen:

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

Door alle bovenstaande wijzigingen door te voeren, gaat Chrome standaard gebruikmaken van origin-keyed agentclusters.

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

Volgende stappen en hulpmiddelen

Om Chrome standaard te laten werken met origin-keyed agentclusters, maken we document.domain alleen-lezen. Het Chrome-team streeft ernaar deze wijziging ergens in 2022 door te voeren.

Foto door Markus Winkler op Unsplash