Żą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ć parametru Origin-Agent-Cluster jako wskazówki, że Twoje źródło powinno mieć własne, oddzielne zasoby, takie jak dedykowany proces.

Zgodność z przeglądarką

Obecnie nagłówek Origin-Agent-Cluster jest implementowany tylko w Chrome 88 i nowszych. 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ć. Ponieważ strony w grupach elementów z kluczem źródła mogą robić mniej niż strony z kluczem strony docelowej (domyślnie), nie ma powodu do obaw o współdziałanie.

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

Sieć WWW opiera się na zasadzie tego samego pochodzenia, która jest funkcją zabezpieczeń ograniczającą sposób interakcji dokumentów i skryptów z zasobami z innego źródła. Na przykład strona hostowana pod adresem https://a.example pochodzi z innego źródła niż strona hostowana pod adresem https://b.example lub https://sub.a.example.

W tle przeglądarki używają oddzielenia, które zapewniają pochodzenie, na różne sposoby. 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. Ponieważ procesy wymagają pewnej ilości pamięci, używają heurystyki, aby nie tworzyć zbyt wielu procesów. Na przykład Firefox ma limit procesów, który można konfigurować, a Chrome zmienia swoje zachowanie na komputerach (gdzie jest więcej pamięci) i na urządzeniach mobilnych (gdzie jest jej mniej).

Te heurystyki nie są doskonałe. Mają też ważne ograniczenie: ponieważ istnieją wyjątki od zasady ograniczonego dostępu, które umożliwiają subdomenom takim jak https://sub.a.examplehttps://a.example komunikowanie się ze sobą, przeglądarki nie mogą automatycznie oddzielać subdomen od siebie.

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ł. Takie strony mogą na przykład 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.

Jednak aby przeprowadzić rozdzielenie i uzyskać 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-ów innych stron, 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:

  • Jeśli to możliwe, korzystają z własnych zasobów. Przykłady to gry wymagające dużej wydajności, witryny do wideokonferencji lub aplikacje do tworzenia multimediów.

  • Zawiera ramki iframe o wysokim zapotrzebowaniu na zasoby, które pochodzą z innego źródła, ale z tego samego 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, aby można było je zaplanować niezależnie i zmniejszyć ich wpływ na wydajność.

  • 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 spodziewa się użycia wielu zasobów na potrzeby czatu wideo i będzie wstawiany w różnych miejscach w https://*.example.com, zespół zajmujący się tym widżetem może użyć nagłówka Origin-Agent-Cluster, aby zmniejszyć wpływ na wydajność w przypadku osób, które wstawiają widżet.

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. Ostatecznie to pomiary decydują, czy klastry agentów ze źródłem jako kluczem pomogą Twojej witrynie. Warto zmierzyć wartości Web Vitals, a także wykorzystanie pamięci, aby sprawdzić, jaki wpływ ma kluczowanie według domeny źródłowej. (Wykorzystanie pamięci jest szczególnie istotne, ponieważ zwiększenie liczby procesów może spowodować zwiększenie obciążenia pamięci przez poszczególne procesy). Nie wystarczy wdrożyć klucze pochodzenia i liczyć na szczęście.

Jak to się ma do izolacji witryn z innych domen?

Używanie nagłówka Origin-Agent-Cluster do grupowania agentów ze źródłem jako kluczem jest powiązane z izolacją między domenami za pomocą nagłówków Cross-Origin-Opener-Policy i Cross-Origin-Embedder-Policy, ale jest od nich niezależne.

Każda witryna, która staje się izolowana między domenami, wyłącza też te same funkcje komunikacji między domenami w ramach tej samej witryny, co w przypadku nagłówka Origin-Agent-Cluster. Nagłówek Origin-Agent-Cluster może jednak być nadal przydatny w ramach izolacji między domenami jako dodatkowa wskazówka dla przeglądarki, która pozwala zmodyfikować heurystyki przypisywania zasobów. Warto więc rozważyć zastosowanie nagłówka Origin-Agent-Cluster i zmierzenie wyników 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 tak, 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ła, i ignoruje nagłówek na kolejnych stronach.

Dlaczego przeglądarka nie zawsze respektuje nagłówek?

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 Origin-Agent-Cluster zamiast tego ignoruje nagłówek, jeśli jest on niezgodny z tym, który był wcześniej widoczny dla 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 klucza źródła lub witryny (przez przeglądarkę, która widzi lub nie widzi nagłówka) zmiana wymaga otwarcia zupełnie nowej karty, która nie jest w żaden sposób powiązana ze starą.

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 izolowanie źródeł) spowodował użycie klucza źródła, false w przypadku, gdy nie spowodował, oraz undefined w przeglądarkach, które nie implementują nagłówka Origin-Agent-Cluster. Zalogowanie 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 inne niż 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 to tylko wskazówka. 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ą tego zrobić 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 w Androidzie Chrome używa jak najmniejszej możliwej liczby procesów.

  • Przeglądarka może chcieć uwzględnić prośbę zawartą w nagłówku Origin-Agent-Cluster, ale może to zrobić, używając 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, ponieważ wskazuje, ż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 tej funkcji, możesz zgłosić problem w repozytorium GitHub HTML Standard. Jeśli napotkasz jakiekolwiek problemy z wdrożeniem Chrome, możesz zgłosić błąd na stronie new.crbug.com, ustawiając w polu Components wartość Internals>Sandbox>SiteIsolation.

Więcej informacji

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