Freigabe von Wasm-Modulen auf denselben Ursprung beschränken

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

Die gemeinsame Nutzung eines WebAssembly-Moduls (Wasm) für Umgebungen mit gleicher Website, aber ursprungsübergreifend wird verworfen, damit Agent-Cluster langfristig Ursprüngen zugeordnet werden können. Entwickler, die Wasm-Module auf diese Weise nutzen, müssen diese Module am selben Ursprung instanziieren, um sie nach Chrome 95 weiterhin nutzen zu können.

Wasm-Module sind und wie sie funktionieren

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

Im folgenden Beispielcode wird ein aus https://iframe.site.example importiertes Wasm-Modul über postMessage() für https://main.site.example freigegeben. Diese Domains sind dieselbe Website, 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 hat intern verschiedene Dokumente, Tabs und Frames auf an Websites gebundenen Agent-Clustern verarbeitet. Das bedeutet, dass dieselben Dokumente auf der Website im selben Prozess verarbeitet werden (wie das genau funktioniert, variiert je nach Browser). Seit Kurzem werden sie in Chrome mit detaillierteren Einheiten verarbeitet: den Ursprüngen. Wir nennen sie Origin-keyed Agent Cluster. Da dies jedoch ressourcenintensiv ist, wurden an Ursprünge gebundene Agent-Cluster heuristisch nur auf bestimmte Websites angewendet.

Der Plan ist, alle Agent-Cluster standardmäßig an Ursprünge gebunden zu machen. Dazu müssen wir die Funktionen einschränken, die an Websites gebundene Ursprungscluster erfordern:

  • (Nur Chrome) Sie können keine SharedArrayBuffer- oder WebAssembly.Memory-Objekte mehr an andere ursprungsübergreifende Seiten derselben Website senden. Diese Funktion ist bereits seit Chrome 92 aktiv.
  • Sie können über postMessage() keine WebAssembly.Module-Objekte mehr 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, mit der ursprungsübergreifende Seiten derselben Website in der Regel synchron auf das jeweils andere DOM zugreifen können. In an Ursprünge gebundenen Agent-Clustern ist sie jedoch deaktiviert.

Wenn alle oben genannten Änderungen vorgenommen wurden, verwendet Chrome standardmäßig an Ursprünge gebundene Agent-Cluster.

Weitere Informationen zu an Ursprünge gebundenen Agent-Clustern finden Sie unter Leistungsisolation mit dem Header „Origin-Agent-Cluster“ anfordern.

Weitere Informationen und Ressourcen

Damit Chrome standardmäßig mit an Ursprünge gebundenen Agent-Clustern arbeitet, wird document.domain schreibgeschützt. Das Chrome-Team möchte diese Änderung im Jahr 2022 umsetzen.

Foto von Markus Winkler auf Unsplash