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

Udostępnianie modułu WebAssembly między środowiskami w ramach tej samej witryny 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 https://iframe.site.example:

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

Począwszy od Chrome 95 nadawca i odbiorca muszą mieć ten sam origin. W tym przypadku https://iframe.site.example musi być https://main.site.example lub odwrotnie.

Dlaczego to jest potrzebne

Chrome wewnętrznie obsługiwało różne dokumenty, karty i ramki w klastrach agentów z kluczem strony. Oznacza to, że dokumenty w ramach tej samej witryny są obsługiwane w ramach tego samego procesu (sposób działania zależy od przeglądarki). Ostatnio 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 wymaga to dużych zasobów, klastry agentów ze źródłem jako kluczem zostały zastosowane tylko do ograniczonej liczby witryn na podstawie heurystyki.

Planujemy, że wszystkie klastry agentów będą domyślnie grupowane ze źródłem jako kluczem. Aby to osiągnąć, musimy ograniczyć możliwości, 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. Ta funkcja działa od wersji Chrome 92.
  • 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 o tej zmianie.
  • 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 przypadku klastrów 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