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.

Czym 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 ze strony https://iframe.site.example jest udostępniany platformie https://main.site.example przez postMessage(). Zauważ, że te domeny są w tej samej witrynie, ale pochodzą z różnych źródeł.

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 różni się w zależności 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. Ta funkcja jest stosowana 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(). Ta zmiana została szczegółowo wyjaśniona poniżej.
  • 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 zamierza wprowadzić tę zmianę w 2022 roku.

Zdjęcie: Markus Winkler na Unsplash