Freigabe von Wasm-Modulen auf denselben Ursprung beschränken

Die Freigabe eines WebAssembly-Moduls zwischen Umgebungen auf derselben Website wird auf denselben Ursprung beschränkt.

Die Freigabe eines WebAssembly-Moduls (Wasm) zwischen Same-Site- aber Cross-Origin-Umgebungen wird eingestellt, damit Agent-Cluster langfristig auf Ursprünge beschränkt werden können. Entwickler, die Wasm-Module auf diese Weise verwenden, müssen diese Module am selben Ursprung instanziieren, um sie nach Chrome 95 weiterhin verwenden zu können.

Was sind Wasm-Module und wie funktionieren sie?

WebAssembly-Programme sind in Modulen organisiert, die die Einheit für Bereitstellung, Laden und Kompilierung darstellen.

Im folgenden Beispielcode wird ein von https://iframe.site.example importiertes Wasm-Modul über postMessage() mit https://main.site.example geteilt. Diese Domains sind Same-Site, aber ursprungsübergreifend.

Wasm-Modul auf https://iframe.site.example:

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

Ab Chrome 95 müssen Sender und Empfänger denselben Ursprung haben. Im obigen Fall muss https://iframe.site.example https://main.site.example sein oder umgekehrt.

Warum ist das erforderlich?

Chrome verarbeitet verschiedene Dokumente, Tabs und Frames intern in websitebezogenen Agent-Clustern. Das bedeutet, dass die Dokumente derselben Website innerhalb desselben Prozesses verarbeitet werden. Wie genau das funktioniert, ist von Browser zu Browser unterschiedlich. Seit Kurzem werden sie in Chrome in feineren Einheiten verarbeitet: Ursprüngen. Wir nennen es Origin-keyed Agent Clustering. Da dies jedoch ressourcenintensiv ist, wurden Origin-keyed Agent Clustering nur heuristisch auf bestimmte Websites angewendet.

Es ist geplant, alle Agent-Cluster standardmäßig an Ursprünge zu binden. Dazu müssen wir die Funktionen einschränken, für die Ursprungscluster mit Website-Schlüssel erforderlich sind:

  • (Nur Chrome) Sie können keine SharedArrayBuffer- oder WebAssembly.Memory-Objekte mehr an andere ursprungsübergreifende Seiten auf derselben Website senden. Dies ist seit Chrome 92 bereits der Fall.
  • Sie können keine WebAssembly.Module-Objekte mehr über postMessage() an andere ursprungsübergreifende Seiten derselben Website senden. Diese Änderung wird unten ausführlicher erläutert.
  • Sie können document.domain nicht mehr festlegen. Dies ist eine Legacy-Funktion, die normalerweise ursprungsübergreifenden Seiten auf derselben Website den synchronen Zugriff auf das DOM der jeweils anderen Seite ermöglicht. In Origin-keyed Agent-Clustern ist sie jedoch deaktiviert.

Durch die Berücksichtigung aller oben genannten Änderungen wird Chrome standardmäßig auf die Verwendung von Origin-keyed Agent Clustering umgestellt.

Weitere Informationen zu Origin-keyed Agent Clustering finden Sie unter Requesting performance isolation with the Origin-Agent-Cluster header.

Weitere Informationen und Ressourcen

Damit Chrome standardmäßig mit Origin-keyed Agent Clustering funktioniert, wird document.domain schreibgeschützt. Das Chrome-Team plant, diese Änderung im Laufe des Jahres 2022 umzusetzen.

Foto von Markus Winkler auf Unsplash