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

Udostępnianie modułu WebAssembly między środowiskami tej samej witryny będzie ograniczone tylko do tej samej domeny.

Udostępnianie modułu WebAssembly (Wasm) między środowiskami w tej samej witrynie, ale z innych domen zostanie wycofane, aby umożliwić długoterminowe ograniczanie klastrów agentów do źródeł. Deweloperzy, którzy korzystają w ten sposób z modułów Wasm, muszą utworzyć instancje w tej samej domenie, aby mogli z nich korzystać po aktualizacji Chrome 95.

Czym są moduły Wasm i jak działają

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

W poniższym przykładowym kodzie moduł Wasm zaimportowany z https://iframe.site.example jest udostępniany partnerowi https://main.site.example przez postMessage(). Zwróć uwagę, że te domeny są w tej samej witrynie, ale z innych domen.

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 Chrome 95 nadawca i odbiorca muszą być w tej samej domenie. W tym przypadku https://iframe.site.example musi mieć wartość https://main.site.example lub na odwrót.

Dlaczego jest to potrzebne

Chrome obsługuje wewnętrznie różne dokumenty, karty i ramki w klastrach agentów z witryną jako kluczem. Oznacza to, że dokumenty w tej samej witrynie są przetwarzane w ramach tego samego procesu (proces ten różni się w zależności od przeglądarki). Od niedawna Chrome obsługuje je w bardziej szczegółowych jednostkach: origin. Nazywamy to klastrami agentów „origin-keyed”. Ponieważ jednak takie rozwiązanie jest kosztowne, klastry agentów ze źródłem jako kluczem były stosowane tylko w ograniczonych witrynach heurystycznie.

Planuje się, aby wszystkie klastry agentów były domyślnie ustawione jako źródło jako klucz. Aby było to możliwe, musimy ograniczyć możliwości, które wymagają klastrów źródła z witryną jako kluczem:

  • (Tylko w Chrome) Nie można już wysyłać obiektów SharedArrayBuffer ani WebAssembly.Memory do innych stron w tej samej witrynie, które pochodzą z innych domen. Ta funkcja jest już stosowana od wersji Chrome 92.
  • Nie możesz już wysyłać obiektów WebAssembly.Module do innych stron w tej samej witrynie w różnych domenach za pomocą postMessage(). Tę zmianę wyjaśnimy szczegółowo poniżej.
  • Nie możesz już ustawiać wartości document.domain. Jest to starsza funkcja, która zwykle umożliwia stronom z tej samej witryny z różnych domen synchronizujący się nawzajem DOM, ale w klastrach agentów ze źródłem jako kluczem jest wyłączona.

W wyniku wprowadzenia wszystkich powyższych zmian Chrome będzie domyślnie korzystać z klastrów agentów ze źródłem jako kluczem.

Więcej informacji o klastrach agentów ze źródłem jako kluczem znajdziesz w artykule Wysyłanie żądania izolacji wydajności za pomocą nagłówka Origin-Agent-Cluster.

Zasoby i dalsze kroki

Aby przeglądarka Chrome domyślnie działała z klastrami agentów ze źródłem jako kluczem, ustawimy document.domain tylko do odczytu. Zespół Chrome zamierza wprowadzić tę zmianę w 2022 r.

Zdjęcie: Markus Winkler w Unsplash