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

Nowy nagłówek odpowiedzi HTTP, który ogranicza obsługę skryptów w całej domenie i żąda dedykowanych zasobów w przeglądarce.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster to nowy nagłówek odpowiedzi HTTP, który informuje przeglądarkę, że uniemożliwia dostęp za pomocą skryptów synchronicznych między stronami w tej samej witrynie i z innych domen. Przeglądarki mogą też używać właściwości Origin-Agent-Cluster jako wskazówki, że punkt początkowy powinien otrzymać własne, osobne zasoby, np. specjalny proces.

Zgodność z przeglądarką

Obecnie nagłówek Origin-Agent-Cluster jest zaimplementowany tylko w Chrome 88 i nowszych. Został on stworzony we współpracy z przedstawicielami Mozilli Firefox, którzy stwierdzili, że jest wartym prototypem, i wstępnie spotkał się z pozytywnym odbiorem od przedstawicieli WebKit, czyli silnika przeglądarki wykorzystywanego przez Safari.

Obecnie nie ma problemu z wdrożeniem nagłówka Origin-Agent-Cluster u wszystkich użytkowników. Przeglądarki, które nie rozumieją go, po prostu go zignorują. A ponieważ strony w klastrach agentów ze źródłem jako kluczem mogą wykonywać mniej czynności niż te z witryną jako kluczem (ustawienie domyślne), nie ma żadnych problemów ze współpracą.

Dlaczego przeglądarki nie mogą automatycznie segregować źródeł 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 korzystają na różne sposoby z separacji, którą zapewniają źródła. W dawnych czasach, mimo że oddzielne źródła nie miałyby dostępu do swoich danych, i tak współużytkowały zasoby, takie jak wątki systemu operacyjnego, procesy i alokacja pamięci. Jeśli jedna karta działa wolno, spowalnia wszystkie pozostałe. a jedna z nich wykorzystywała zbyt dużo pamięci, to powodująca awarię całej przeglądarki.

Współczesne przeglądarki są bardziej wyrafinowane i dążą do rozdzielania różnych źródeł na różne procesy. Sposób działania różni się w zależności od przeglądarki: większość przeglądarek korzysta z pewnego stopnia rozdziału między kartami, ale różne elementy iframe na jednej karcie mogą mieć wspólny proces. 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że być konfigurowany 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 pozwalają subdomenom, takim jak https://sub.a.example i https://a.example, komunikować się ze sobą, przeglądarki nie mogą automatycznie oddzielać od siebie subdomen.

To domyślne działanie nosi nazwę „klastrów agentów z witryną jako kluczem”, co oznacza, że przeglądarka grupuje strony na podstawie swojej witryny. Nowy nagłówek Origin-Agent-Cluster prosi przeglądarkę o zmianę tego domyślnego działania na danej stronie i umieszczanie go w klastrze agentów z źródłom kluczem, co powoduje, że jest grupowana tylko z innymi stronami o dokładnie takim samym pochodzeniu. W szczególności z klastra agentów wykluczane będą strony między domenami w tej samej witrynie.

Taki rozdzielenie zezwala przeglądarkom na udostępnianie tym nowym grupom agentów ze źródłem jako kluczem własnych zasobów, które nie są połączone z tymi z innych źródeł. Na przykład takie strony mogą generować własne procesy lub być zaplanowane w osobnych wątkach. Dodając nagłówek Origin-Agent-Cluster do swojej strony, wskazujesz przeglądarce, że taka strona może skorzystać na dostępnych na niej zasobach.

Aby jednak przeprowadzić rozdzielenie i uzyskać te korzyści, przeglądarka musi wyłączyć niektóre starsze funkcje.

Czego nie mogą robić strony ze źródłem jako kluczem

Gdy Twoja strona znajduje się w grupie agentów ze źródłem jako kluczem, tracisz możliwość rozmawiania ze stronami znajdującymi się w tej samej witrynie i z różnych domen, które były wcześniej dostępne. W szczególności:

  • Nie możesz już ustawiać właściwości document.domain. To starsza funkcja, która zwykle zezwala stronom z różnych domen w tej samej witrynie na synchroniczny dostęp do DOM, ale w klastrach 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 witrynie i z różnych domen za pomocą postMessage().

  • (Tylko w Chrome) Nie można już wysyłać obiektów SharedArrayBuffer ani obiektów WebAssembly.Memory do innych stron w tej samej witrynie i z różnych domen.

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:

  • Najlepsze wyniki uzyskasz w miarę możliwości dzięki własnym wyspecjalizowanym zasobom. Są to na przykład gry mocno wydajne pod względem wydajności, witryny do wideokonferencji czy aplikacje do tworzenia multimediów.

  • Zawiera elementy iframe wymagające dużej ilości zasobów, które różnią się źródłem, ale pochodzą z tej samej witryny. Jeśli na przykład https://mail.example.com umieszcza elementy iframe https://chat.example.com, stosowanie klucza źródła https://mail.example.com/ sprawia, że kod napisany przez zespół czatu nie może przypadkowo zakłócać kodu napisanego przez zespół ds. poczty, i może polecić przeglądarce włączenie osobnych procesów planowania, by mogły one niezależnie planować te elementy i zmniejszyć wzajemny wpływ na wydajność.

  • Możesz oczekiwać, że będą one umieszczone na stronach w tej samej witrynie pochodzącej z innego źródła, ale pamiętaj, że te elementy wymagają dużej ilości 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.

Upewnij się też, że zgadzasz się na wyłączenie omówionych powyżej rzadko używane funkcje komunikacji między domenami i że Twoja witryna używa protokołu HTTPS.

Ostatecznie to tylko wytyczne. 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. (zwłaszcza wykorzystanie pamięci jest potencjalnym problemem, ponieważ zwiększenie liczby uruchomionych procesów może spowodować większe obciążenie pamięci dla poszczególnych procesów). Nie wystarczy wdrożyć klucze origin i mieć nadzieję, że wszystko będzie w porządku.

Jaki jest związek z izolacją zasobów z innych domen?

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 jest izolowana od zasobów z innych domen, wyłącza też te same funkcje komunikacyjne między domenami w tej samej witrynie 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, jak zmienić heurystykę alokacji zasobów. Warto więc zastosować nagłówek Origin-Agent-Cluster i mierzyć wyniki nawet na stronach, które są już izolowane od zasobów z innych domen.

Jak używać 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 strukturalnego wartości logicznej true.

Pamiętaj, aby wysyłać ten nagłówek do wszystkich odpowiedzi ze źródła, a nie tylko do niektórych stron. W przeciwnym razie mogą wystąpić niespójne wyniki – przeglądarka „zapamiętuje” żądanie utworzenia klucza źródła i dlatego stosuje klucze origin nawet na stronach, które o to nie proszą. Albo na odwrót: jeśli pierwsza strona odwiedzana przez użytkownika nie ma nagłówka, przeglądarka zapamięta, że źródło nie chce mieć klucza pochodzenia i na kolejnych stronach ignoruje nagłówek.

Dlaczego przeglądarka nie zawsze może uwzględnić nagłówek?

Ta „pamięć” ma na celu zapewnienie spójności kluczy dla źródła. Jeśli niektóre strony w źródle miały dostęp do źródła, a inne nie, możliwe, że istniały 2 strony o tym samym źródle, które zostały umieszczone w różnych klastrach agentów i dlatego nie mogły się ze sobą komunikować. Byłoby to bardzo dziwne zarówno dla programistów stron internetowych, jak i wewnętrznych użytkowników przeglądarki. Dlatego specyfikacja dotycząca atrybutu Origin-Agent-Cluster ignoruje nagłówek, jeśli jest on niespó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, która jest grupą kart, okien lub elementów iframe, które mogą się 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 przy testowaniu nagłówka Origin-Agent-Cluster. Przy pierwszym dodawaniu strony do witryny nie skutkuje jej ponownym załadowaniem – musisz zamknąć kartę i otworzyć nową.

Aby sprawdzić, czy nagłówek Origin-Agent-Cluster został zastosowany, użyj właściwości JavaScript window.originAgentCluster. Będzie to true w przypadkach, gdy nagłówek (lub inne mechanizmy, takie jak izolacja zasobów z innych domen) spowodował użycie klucza źródła, false, gdy go nie uzyskał, i undefined w przeglądarkach, które nie implementują nagłówka Origin-Agent-Cluster. Zapisanie tych danych na platformie analitycznej może przynieść cenną wskazówkę, czy serwer jest prawidłowo skonfigurowany.

Pamiętaj też, że nagłówek Origin-Agent-Cluster działa tylko w bezpiecznych kontekstach, tj. na stronach HTTPS i http://localhost. Strony HTTP inne niż lokalne hosty nie obsługują klastrów agentów ze źródłem jako kluczem.

Uzyskiwanie klucza źródłowego nie jest funkcją zabezpieczeń

Chociaż używanie klastra agentów ze źródłem jako kluczem izoluje źródło od dostępu synchronicznego od stron z innej witryny w tej samej witrynie, nie zapewnia ochrony nagłówków związanych z bezpieczeństwem, takich jak Cross-Origin-Resource-Policy i Cross-Origin-Opener-Policy. W szczególności nie stanowi to niezawodnej ochrony przed atakami kanału bocznego, takimi jak Spectre.

Może to być trochę zaskakujące, ponieważ kluczowanie źródła może czasami powodować, że źródło uzyskuje własny proces, a oddzielne procesy stanowią ważną obronę przed atakami z kanału bocznego. Pamiętaj jednak, że nagłówek Origin-Agent-Cluster jest tylko wskazówką. Przeglądarka nie ma obowiązku ustanowienia dla Twojego źródła osobnego procesu i może tego nie zrobić z różnych powodów:

  • Przeglądarka może nie wdrożyć w tym celu technologii. Na przykład obecnie Safari i Firefox mogą umieszczać osobne karty w swoich procesach, ale jeszcze nie w przypadku elementów iframe.

  • Przeglądarka może uznać, że nie warto wykonywać 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 eksploruje przy użyciu wątków, a nie procesów, aby odizolować wydajność.

  • Użytkownik lub kod działający w innej witrynie mógł już przejść na stronę z witryną jako kluczem w Twojej witrynie, co spowodowało uruchomienie gwarancji spójności i całkowite zignorowanie nagłówka Origin-Agent-Cluster.

Z tego powodu klastry agentów ze źródłem jako kluczem nie należy traktować jako funkcji zabezpieczeń. Jest to tylko sposób na ułatwienie przeglądarce priorytetowego przydzielania zasobów przez wskazanie, że Twoja źródło czerpie korzyści ze specjalnych zasobów (i że w zamian możesz zrezygnować z określonych funkcji).

Prześlij opinię

Zespół Chrome chętnie pozna Twoją opinię, jeśli używasz nagłówka Origin-Agent-Cluster lub rozważasz jego użycie. Twoje interesy publiczne i Twoje wsparcie pomagają nam określać priorytety funkcji i pokazywać, jak ważne są one innym dostawcom przeglądarek. Napisz tweeta na stronie @ChromiumDev, by podzielić się swoimi przemyśleniami i doświadczeniami z Chrome DevRel.

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 jakieś problemy z implementacją Chrome, możesz zgłosić błąd na stronie new.crbug.com, podając w polu Komponenty 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: