Żądanie izolacji wydajności przy użyciu nagłówka Origin-Agent-Cluster

nowy nagłówek odpowiedzi HTTP, który ogranicza skrypty w całej domenie i umożliwia żądanie specjalnych zasobów z przeglądarki;

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster to nowy nagłówek odpowiedzi HTTP, który nakazuje przeglądarce zapobieganie synchronicznemu dostępowi do skryptów między stronami w tej samej witrynie z różnych domen. Przeglądarki mogą też używać Origin-Agent-Cluster jako wskazówki, że Twoje źródło powinno mieć własne, oddzielne zasoby, takie jak dedykowany proces.

Obecnie nagłówek Origin-Agent-Cluster jest implementowany tylko w Chrome 88 i nowszych wersjach. Został on zaprojektowany we współpracy z przedstawicielami Mozilli Firefox, którzy uznali, że warto go prototypować. Wstępne opinie przedstawicieli WebKit, czyli silnika przeglądarki używanego przez Safari, są pozytywne.

Tymczasem możesz wdrożyć nagłówek Origin-Agent-Cluster do wszystkich użytkowników. Przeglądarki, które go nie rozumieją, będą go ignorować. A ponieważ strony w klastrach agentów ze źródłem jako kluczem mogą wykonywać mniej funkcji niż te z witryną jako kluczem (ustawienie domyślne), nie ma żadnych problemów ze współpracą.

Dlaczego przeglądarki nie mogą automatycznie oddzielać źródeł w ramach tej samej witryny

Internet opiera się na zasadzie tego samego źródła, która jest funkcją zabezpieczeń, która ogranicza możliwość interakcji dokumentów i skryptów z zasobami z innego źródła. Na przykład strona hostowana pod adresem https://a.example ma inne źródło niż strona https://b.example lub strona https://sub.a.example.

Za kulisami przeglądarki na różne sposoby korzystają z separacji, którą zapewniają źródła. Wcześniej, mimo że oddzielne źródła nie miały dostępu do danych innych źródeł, mogły współdzielić zasoby, takie jak wątki, procesy i alokację pamięci. Oznacza to, że jeśli jedna karta działała wolno, spowalniała wszystkie pozostałe. Jeśli jedna karta zużywa zbyt dużo pamięci, może spowodować awarię całej przeglądarki.

Obecnie przeglądarki są bardziej zaawansowane i starają się oddzielać różne źródła w różne procesy. Sposób działania zależy od przeglądarki: większość z nich zapewnia pewien poziom rozdzielczości między kartami, ale różne elementy iframe na jednej karcie mogą korzystać z tego samego procesu. Procesy mają pewne zapotrzebowanie pamięci, dlatego korzystają z heurystyki, by uniknąć generowania zbyt wielu elementów. Na przykład w przeglądarce Firefox limit procesów można skonfigurować przez użytkownika, a Chrome różni się w zależności od jej działania na komputerach (gdzie jest więcej pamięci) i na urządzeniach mobilnych (gdzie jest jej mało).

Takie dane heurystyczne nie są doskonałe. Obowiązują ich też ważne ograniczenia: istnieją wyjątki od zasad dotyczących tego samego źródła, które zezwalają subdomenom, takim jak https://sub.a.example i https://a.example, na komunikację ze sobą, przeglądarki nie mogą automatycznie oddzielać od siebie subdomen.

To domyślne zachowanie nazywa się „grupami agentów z witryną jako kluczem”. Oznacza to, że przeglądarka grupowanie strony według witryny. Nowy nagłówek Origin-Agent-Cluster prosi przeglądarkę o zmianę domyślnego zachowania w przypadku danej strony, umieszczając ją w grupie agentów z kluczem origin, tak aby była grupowana tylko z innymi stronami o tym samym źródle. W szczególności strony w tej samej witrynie i z innej domeny będą wykluczone z grupy agentów.

Ta opcjonalna separacja umożliwia przeglądarkom przydzielanie nowym klasterom agentów ze źródłem jako kluczem własnych zasobów, które nie są łączone z zasobami innych źródeł. Na przykład takie strony mogą mieć własny proces lub być zaplanowane w osobnych wątkach. Dodając do strony nagłówek Origin-Agent-Cluster, wskazujesz przeglądarce, że strona może korzystać z takich zasobów.

Aby jednak można było dokonać podziału i otrzymać te korzyści, przeglądarka musi wyłączyć niektóre starsze funkcje.

Czego nie mogą robić strony z kluczem pochodzenia

Gdy Twoja strona znajduje się w klastrze agentów ze źródłem jako kluczem, tracisz niektóre możliwości komunikacji z poprzednio dostępnymi stronami w tej samej witrynie lub w innych domenach. W szczególności:

  • Nie możesz już ustawiać opcji document.domain. Jest to funkcja starsza, która zwykle umożliwia stronom w tej samej witrynie i z innych domen synchroniczny dostęp do DOM-u każdej z nich, ale w grupach agentów ze źródłem jako kluczem jest wyłączona.

  • Nie możesz już wysyłać obiektów WebAssembly.Module do innych stron w tej samej domenie w innej domenie za pomocą postMessage().

  • (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.

Kiedy używać klastrów agentów ze źródłem jako kluczem

Źródła, które najbardziej korzystają z nagłówka Origin-Agent-Cluster, to te, które:

  • w miarę możliwości korzystają z własnych zasobów; Są to na przykład gry mocno wydajne pod względem wydajności, witryny do wideokonferencji czy aplikacje do tworzenia multimediów.

  • Zawiera duże ilości zasobów iframe, które różnią się źródłem, ale pochodzą z tej samej witryny. Jeśli na przykład https://mail.example.com umieszcza iframe https://chat.example.com, klucz pochodzenia https://mail.example.com/ zapewnia, że kod napisany przez zespół czatu nie będzie przypadkowo zakłócać działania kodu napisanego przez zespół poczty. Może też zasugerować przeglądarce, aby uruchomiła osobne procesy, co pozwoli na ich niezależne planowanie i zmniejszenie wpływu na siebie nawzajem.

  • Zakładamy, że będą one umieszczane na stronach w tej samej witrynie, ale z innej domeny, i że są one obciążające pod względem zasobów. Jeśli na przykład https://customerservicewidget.example.com ma korzystać z wielu zasobów na potrzeby czatu wideo i będzie umieszczany w różnych źródłach w trakcie https://*.example.com, zespół zarządzający tym widżetem może użyć nagłówka Origin-Agent-Cluster, aby zmniejszyć wpływ na działanie odtwarzaczy umieszczonych na stronach.

Musisz też upewnić się, że zgadzasz się na wyłączenie omawianych rzadko używanych funkcji komunikacji między domenami, a także że Twoja witryna korzysta z protokołu HTTPS.

To jednak tylko wskazówki. To, czy klastry agentów ze źródłem jako kluczem będą pomocne w przypadku Twojej witryny, najlepiej określić na podstawie pomiarów. W szczególności warto mierzyć wskaźniki internetowe, a potencjalnie wykorzystanie pamięci, aby sprawdzić, jaki wpływ ma stosowanie klucza źródła. (Wykorzystanie pamięci jest szczególnie istotne, ponieważ zwiększenie liczby procesów może spowodować większe obciążenie pamięci przez poszczególne procesy). Nie wystarczy wdrożyć klucze pochodzenia i liczyć na szczęście.

Jak to się ma do izolacji między domenami?

Klucze źródłowe w klastrach agentów za pomocą nagłówka Origin-Agent-Cluster są związane z izolacją od zasobów z innych domen za pomocą nagłówków Cross-Origin-Opener-Policy i Cross-Origin-Embedder-Policy, ale nie są z nimi związane.

Każda witryna, która staje się izolowana między domenami, wyłączy też te same funkcje komunikacji między domenami w ramach tej samej witryny, co w przypadku nagłówka Origin-Agent-Cluster. Jednak oprócz izolacji od zasobów z innych domen nagłówek Origin-Agent-Cluster może nadal służyć jako dodatkowa wskazówka dla przeglądarki o konieczności zmodyfikowania heurystyki alokacji zasobów. Dlatego warto zastosować nagłówek Origin-Agent-Cluster i zmierzyć wyniki nawet na stronach, które są już izolowane od zasobów z innych domen.

Jak korzystać z nagłówka Origin-Agent-Cluster

Aby użyć nagłówka Origin-Agent-Cluster, skonfiguruj serwer WWW, aby wysyłał ten nagłówek odpowiedzi HTTP:

Origin-Agent-Cluster: ?1

Wartość ?1 to składnia nagłówka strukturyzowanego dla wartości logicznej true.

Ważne jest, aby wysyłać ten nagłówek w wszystkich odpowiedziach z Twojego źródła, a nie tylko z niektórych stron. W przeciwnym razie możesz uzyskać niespójne wyniki, ponieważ przeglądarka „zapamięta” żądanie klucza pochodzenia i będzie żądać klucza pochodzenia nawet na stronach, które o to nie proszą. Albo odwrotnie: jeśli pierwsza strona, którą odwiedza użytkownik, nie zawiera nagłówka, przeglądarka zapamięta, że Twoje źródło nie chce być powiązane z kluczem źródłowym, i ignoruje nagłówek na kolejnych stronach.

Powodem tego „zapamiętania” jest zapewnienie spójności kluczy dla źródła. Jeśli niektóre strony w źródle były kluczowane na podstawie pochodzenia, a inne nie, mogłyby powstać 2 strony w tym samym pochodzeniu, które zostałyby umieszczone w różnych klastrach agentów i nie mogłyby ze sobą współpracować. To byłoby bardzo dziwne, zarówno dla programistów stron internetowych, jak i dla wewnętrznych elementów przeglądarki. Dlatego specyfikacja dotycząca atrybutu Origin-Agent-Cluster ignoruje nagłówek, jeśli nie jest on spójny z tym, co widziano wcześniej w przypadku danego źródła. W Chrome spowoduje to wyświetlenie ostrzeżenia w konsoli.

Ta spójność jest ograniczona do grupy kontekstu przeglądania, czyli grupy kart, okien lub iframe’ów, które mogą się nawzajem komunikować za pomocą mechanizmów takich jak window.opener, frames[0] lub window.parent. Oznacza to, że po ustaleniu powiązania źródła lub klucza witryny (przez wyświetlenie lub niewyświetlanie nagłówka przez przeglądarkę) zmiana wymaga otwarcia zupełnie nowej karty, która nie jest w żaden sposób połączona ze starym elementem.

Te informacje mogą być ważne podczas testowania nagłówka Origin-Agent-Cluster. Gdy po raz pierwszy dodajesz tag do witryny, nie wystarczy odświeżyć strony. Musisz zamknąć kartę i otworzyć nową.

Aby sprawdzić, czy nagłówek Origin-Agent-Cluster jest stosowany, użyj właściwości JavaScript window.originAgentCluster. Będzie to true w przypadku, gdy nagłówek (lub inne mechanizmy, takie jak izolacja między domenami) spowodował kluczowanie pochodzenia; false, gdy tak się nie stało; oraz undefined w przeglądarkach, które nie implementują nagłówka Origin-Agent-Cluster. Rejestrowanie tych danych na platformie analitycznej może być przydatnym sposobem na sprawdzenie, czy serwer jest prawidłowo skonfigurowany.

Pamiętaj też, że nagłówek Origin-Agent-Cluster działa tylko w bezpiecznych kontekstach, czyli na stronach HTTPS lub na http://localhost. Strony HTTP spoza domeny localhost nie obsługują klastrów agentów z kluczem źródła.

Używanie klucza źródła nie jest funkcją zabezpieczeń

Korzystanie z klastra agentów ze źródłem jako kluczem izoluje źródło przed synchronicznym dostępem z tych samych stron w różnych domenach, ale nie zapewnia ochrony nagłówków związanych z bezpieczeństwem, takich jak Cross-Origin-Resource-PolicyCross-Origin-Opener-Policy. W szczególności nie zapewnia ona niezawodnej ochrony przed atakami kanału bocznego, takimi jak Spectre.

Może to być nieco zaskakujące, ponieważ kluczowanie pochodzenia może czasami powodować, że pochodzenie otrzymuje własny proces, a oddzielne procesy stanowią ważną ochronę przed atakami kanałami bocznymi. Pamiętaj jednak, że nagłówek Origin-Agent-Cluster jest tylko wskazówką. Przeglądarka nie ma obowiązku tworzenia osobnego procesu dla Twojego źródła i może tego nie robić z różnych powodów:

  • Przeglądarka może nie mieć zaimplementowanej odpowiedniej technologii. Obecnie Safari i Firefox mogą umieszczać oddzielne karty w osobnych procesach, ale nie mogą jeszcze robić tego w przypadku ramek iframe.

  • Przeglądarka może uznać, że nie warto uruchamiać osobnego procesu. Na przykład na urządzeniach z Androidem o małej ilości pamięci lub w komponencie WebView Androida Chrome używa jak najmniejszej liczby procesów.

  • Przeglądarka może uwzględniać żądanie wskazane w nagłówku Origin-Agent-Cluster, ale może to robić przy użyciu innej technologii izolacji niż procesy. Na przykład Chrome badania korzystania z wątków zamiast procesów w celu zapewnienia tego rodzaju izolacji wydajności.

  • Użytkownik lub kod działający w innej witrynie mógł już przejść do strony z kluczem witryny w Twoim pochodzeniu, co spowodowało uruchomienie gwarancji spójności i całkowite zignorowanie nagłówka Origin-Agent-Cluster.

Z tych powodów nie należy traktować grup agentów ze źródłem jako kluczem jako funkcji zabezpieczającej. Zamiast tego jest to sposób na pomoc przeglądarce w przyznawaniu priorytetów przydzielaniu zasobów, który polega na zasugerowaniu, że Twoje źródło skorzysta z dedykowanych zasobów (i że jesteś gotowy zrezygnować w zamian za to z pewnych funkcji).

Prześlij opinię

Zespół Chrome chętnie dowie się, czy używasz nagłówka Origin-Agent-Cluster lub rozważasz jego użycie. Wasze zainteresowanie i wsparcie pomagają nam ustalać priorytety funkcji i pokazywać innym dostawcom przeglądarek, jak ważne są te funkcje. Prześlij tweeta do @ChromiumDev i powiedz zespołowi Chrome DevRel o swoich przemyśleniach i doświadczeniach.

Jeśli masz więcej pytań na temat specyfikacji lub szczegółów działania funkcji, możesz zgłosić problem w repozytorium HTML Standard na GitHubie. Jeśli napotkasz jakiekolwiek problemy z wdrożeniem Chrome, możesz zgłosić błąd na stronie new.crbug.com, ustawiając w polu Składniki wartość Internals>Sandbox>SiteIsolation.

Więcej informacji

Aby dowiedzieć się więcej o klastrach agentów ze źródłem jako kluczem, kliknij te linki: