Ograniczenie udostępniania modułu Wasm do tej samej domeny

Udostępnianie modułu WebAssembly między środowiskami w tej samej witrynie będzie ograniczone tylko do źródeł wewnętrznych.

Udostępnianie modułu WebAssembly (Wasm) między środowiskami w tej samej witrynie, ale z różnych domen, zostanie wycofane, aby umożliwić grupom agentów ograniczenie zakresu do pochodzenia na dłuższą metę. Deweloperzy, którzy używają modułów Wasm w taki sposób, muszą upewnić się, że instancje tych modułów są tworzone w tym samym źródle, aby można było ich używać po Chrome 95.

Co to są moduły Wasm i jak działają

Programy WebAssembly są podzielone na moduły, które są jednostką wdrażania, wczytywania i kompilacji.

W poniższym przykładowym kodzie moduł Wasm zaimportowany z poziomu https://iframe.site.example jest udostępniany modułowi https://main.site.example za pomocą postMessage(). Zauważ, że te domeny są w tej samej witrynie, ale w różnych domenach.

Moduł Wasm na urządzeniu https://iframe.site.example:

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

Od wersji Chrome 95 nadawca i odbiorca muszą mieć ten sam origin. W tym przypadku https://iframe.site.example musi być równe https://main.site.example lub odwrotnie.

Dlaczego to jest potrzebne

Chrome wewnętrznie obsługuje różne dokumenty, karty i ramki w klastrach agentów z kluczem strony. Oznacza to, że dokumenty w tej samej witrynie są obsługiwane w ramach tego samego procesu (sposób działania zależy od przeglądarki). Niedawno Chrome zaczęło obsługiwać je w bardziej szczegółowych jednostkach: źródłach. Nazywamy je klastrami agentów ze źródłem jako kluczem. Ponieważ jednak jest to kosztowne, klastry agentów ze źródłem jako kluczem zostały zastosowane tylko do ograniczonej liczby witryn za pomocą heurystyki.

Planujemy, że wszystkie klastry agentów będą domyślnie miały źródło jako klucz. Aby to osiągnąć, musimy ograniczyć funkcje, które wymagają klastrów źródeł z kluczem witryny:

  • (dotyczy tylko Chrome) nie możesz już wysyłać obiektów SharedArrayBuffer ani WebAssembly.Memory do innych stron w tej samej domenie, ale w innej witrynie. Jest to już dostępne od wersji 92 Chrome.
  • Nie możesz już wysyłać obiektów WebAssembly.Module do innych stron w tej samej domenie w innej domenie za pomocą postMessage(). Poniżej znajdziesz więcej informacji na temat tej zmiany.
  • Nie możesz już ustawiać opcji document.domain. Jest to funkcja starsza, która zwykle pozwala stronom w tej samej witrynie z innych domen na synchroniczny dostęp do interfejsu DOM, ale w grupach agentów z witryną jako kluczem jest wyłączona.

Po wprowadzeniu wszystkich powyższych zmian Chrome będzie domyślnie używać klastrów agentów z kluczem źródła.

Więcej informacji o klastrach agentów ze źródłem jako kluczem znajdziesz w artykule Prośba o izolację skuteczności za pomocą nagłówka Origin-Agent-Cluster.

Zasoby i dalsze kroki

Aby Chrome domyślnie współpracowało z grupami agentów z kluczem źródła, uczynimy document.domain tylko do odczytu. Zespół Chrome planuje wprowadzić tę zmianę w 2022 r.

Zdjęcie: Markus Winkler na Unsplash