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 verschillende oorsprongen wordt afgeschaft, zodat agentclusters op lange termijn kunnen worden getarget op de oorspronkelijke 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
ofWebAssembly.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 viapostMessage()
. 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