Żą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 z przeglądarki.

Domenica Denicola
Domenic Denicola

Origin-Agent-Cluster to nowy nagłówek odpowiedzi HTTP, który informuje przeglądarkę, że ma uniemożliwić synchronizowanie skryptów między stronami w tej samej witrynie i w różnych domenach. Przeglądarki mogą też używać atrybutu Origin-Agent-Cluster, aby wskazać, że źródło powinno mieć 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 wersjach. Został on opracowany w ścisłej współpracy z przedstawicielami Mozilla Firefox, którzy oznaczyli go jako warte prototypowania i wstępnie spotkał się z pozytywnym odbiorem przez przedstawicieli WebKit, czyli silnika przeglądarki używanego w Safari.

Tymczasem możesz bez problemu wdrożyć nagłówek Origin-Agent-Cluster u wszystkich użytkowników już dziś. Przeglądarki, które go nie rozpoznają, zignorują go. Ponieważ strony w klastrach agentów ze źródłem jako kluczem mogą wykonywać mniej działań niż te z witryną jako kluczem (domyślne), nie musisz się więc obawiać o problem ze zgodnością.

Dlaczego przeglądarki nie mogą automatycznie segregować źródeł tych samych witryn

Sieć jest oparta na zasadach dotyczących tego samego pochodzenia, czyli funkcji zabezpieczeń, która ogranicza możliwość interakcji dokumentów i skryptów z zasobami z innego źródła. Na przykład strona hostowana w domenie https://a.example ma inne źródło niż strona w domenie https://b.example albo strona pod adresem https://sub.a.example.

Niekiedy przeglądarki wykorzystują różne rozdziały, które udostępniają źródła. Dawniej, mimo że oddzielne źródła nie miały dostępu do swoich danych, nadal udostępniały sobie zasoby takie jak wątki systemu operacyjnego, procesy i przydział pamięci. To oznacza, że jeśli jedna karta działa wolniej, wszystkie pozostałe działają wolniej. Jeśli jedna karta wykorzystuje za dużo pamięci, może to spowodować awarię całej przeglądarki.

W dzisiejszych czasach przeglądarki są bardziej zaawansowane i próbują rozdzielać źródła treści na różne procesy. Sposób działania różni się w zależności od przeglądarki: w większości przeglądarek stosowane są pewne rozdzielenia kart, ale różne elementy iframe w obrębie jednej karty mogą korzystać z tego samego procesu. Ponieważ procesy wiążą się z pewnym obciążeniem pamięci, korzystają z metod heurystycznych, które zapobiegają zbyt wielu pojawianiom. Na przykład w Firefoksie obowiązuje konfigurowany przez użytkownika limit procesów, a Chrome działa inaczej w zależności od tego, czy jest na komputerze (gdzie jest więcej pamięci), czy też na urządzeniu mobilnym (tam, gdzie jest mało pamięci).

Ta heurystyka nie jest doskonała. Istnieją jednak ważne ograniczenia: istnieją wyjątki od zasady tej samej domeny, które pozwalają na komunikację między subdomenami https://sub.a.example i https://a.example, dlatego przeglądarki nie mogą automatycznie segregować od siebie subdomen.

To domyślne działanie nazywa się „klastrami agentów z witryną jako kluczem”, czyli grupuje strony w witrynie. Nowy nagłówek Origin-Agent-Cluster prosi przeglądarkę o zmianę domyślnego działania danej strony przez umieszczenie jej w klastrze agentów z kluczem origin, tak aby była ona grupowana tylko z innymi stronami o dokładnie takim samym pochodzeniu. W szczególności z klastra agentów będą wykluczane strony z innych domen w tej samej witrynie.

Ten rozdział akceptacji umożliwia przeglądarkom przyznanie tym nowym klastrom agentów ze źródłem jako kluczem własnych zasobów, które nie są łączone z innymi klastrami. Na przykład takie strony mogą mieć własny proces lub być zaplanowane w oddzielnych wątkach. Dodając do strony nagłówek Origin-Agent-Cluster, informujesz przeglądarkę, że może ona skorzystać z takich dedykowanych zasobów.

Aby jednak można było to oddzielić 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 strona znajduje się w grupie agentów ze źródłem jako kluczem, tracisz możliwość komunikacji z dotychczasowymi stronami z różnych domen w tej samej witrynie. W szczególności:

  • Nie możesz już ustawiać wartości document.domain. Jest to starsza funkcja, która zwykle umożliwia stronom pochodzącym z tej samej witryny z innych domen synchronicznie dostęp do DOM drugiej witryny, 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 w różnych domenach za pomocą postMessage().

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

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

Zastosowanie nagłówka Origin-Agent-Cluster to najkorzystniejsze źródło korzyści:

  • W miarę możliwości korzystaj z własnych zasobów. Są to na przykład gry o dużej wydajności, strony do wideokonferencji czy aplikacje do tworzenia multimediów.

  • Zawiera elementy iframe zużywające dużo zasobów, które są w tej samej witrynie, ale z różnych źródeł. Jeśli na przykład w https://mail.example.com są umieszczone elementy iframe https://chat.example.com, zastosowanie klucza źródła https://mail.example.com/ sprawi, że kod napisany przez zespół czatu nie będzie mógł przypadkiem zakłócać kodu napisanego przez zespół pocztowy. Może też poinformować przeglądarkę o osobnych procesach na zaplanowanie poszczególnych procesów niezależnie od siebie i obniżenie ich wydajności.

  • Reklamy są osadzone na stronach w tej samej witrynie różnego pochodzenia, ale wymagają dużej ilości zasobów. Jeśli na przykład https://customerservicewidget.example.com oczekuje, że będzie używać wielu zasobów na potrzeby czatu wideo i zostanie umieszczony w różnych miejscach w https://*.example.com, zespół zarządzający tym widżetem może użyć nagłówka Origin-Agent-Cluster, aby zmniejszyć wydajność aplikacji.

Musisz też sprawdzić, czy masz uprawnienia do wyłączenia omówionych powyżej rzadko używanych funkcji komunikacji między domenami oraz czy Twoja witryna używa protokołu HTTPS.

Ostatecznie są to jednak tylko wskazówki. To, czy klastry agentów ze źródłem jako kluczem pomogą Twojej witrynie, ostatecznie najlepiej określić na podstawie pomiarów. W szczególności warto jest mierzyć wskaźniki internetowe, a potencjalnie wykorzystanie pamięci, by sprawdzić, jaki wpływ ma wykorzystanie źródła klucza. Szczególnie obawiamy się o wykorzystanie pamięci, ponieważ zwiększenie liczby używanych procesów może powodować większe obciążenie pamięci przez poszczególne procesy. Nie wystarczy po prostu wdrożyć klucze źródła i mieć nadzieję, że wyjdzie Ci na dobre.

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

Kluczowe kluczowanie klastrów agentów za pomocą nagłówka Origin-Agent-Cluster jest związane z izolacją zasobów z innych domen przez nagłówki Cross-Origin-Opener-Policy i Cross-Origin-Embedder-Policy, ale nie jest od niej niezależne.

Każda witryna, która jest izolowana od zasobów z innych domen, wyłączy też te same funkcje komunikacji między domenami w tej samej witrynie co w przypadku używania nagłówka Origin-Agent-Cluster. Jednak nagłówek Origin-Agent-Cluster może być jednak przydatny w połączeniu z izolacją zasobów z innych domen jako dodatkowa wskazówka dla przeglądarki dotycząca modyfikacji heurystyki alokacji zasobów. Warto więc zastosować nagłówek Origin-Agent-Cluster i zmierzyć wyniki nawet w przypadku stron, 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 uporządkowanego nagłówka wartości logicznej true.

Ważne jest, aby wysyłać ten nagłówek do wszystkich odpowiedzi ze źródła, a nie tylko do niektórych stron. W przeciwnym razie mogą pojawić się niespójne wyniki – przeglądarka „zapamiętuje” żądanie dostępu do źródła klucza i sprawdza klucze origin-key nawet na stronach, które o nie 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 być powiązane ze źródłem jako kluczem i zignoruje nagłówek na kolejnych stronach.

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

Ta „pamięć” ma na celu zapewnienie spójności kluczowania dla źródła. Jeśli niektóre strony w źródle były oznaczone jako źródło jako kluczem, a inne nie, mogły mieć 2 strony z tym samym źródłem, które zostały umieszczone w różnych klastrach agentów i nie mogły się ze sobą komunikować. Byłoby to bardzo dziwne zarówno dla programistów stron internetowych, jak i dla funkcji wewnętrznych przeglądarki. Dlatego specyfikacja Origin-Agent-Cluster ignoruje nagłówek, jeśli jest on niezgodny z wcześniejszym stanem w przypadku danego źródła. W Chrome wyświetli się ostrzeżenie w konsoli.

Spójność jest ograniczona do grupy kontekstu przeglądania, czyli grupy kart, okien lub elementów iframe, które mogą się ze sobą komunikować za pomocą mechanizmów takich jak window.opener, frames[0] czy window.parent. Oznacza to, że po uzgodnieniu źródła pochodzenia lub klucza witryny (przez to, że przeglądarka zobaczy nagłówek lub go nie widzi), wprowadzenie zmian wymaga otwarcia zupełnie nowej karty, niepowiązanej w żaden sposób ze starą.

Te szczegóły mogą być ważne podczas testowania nagłówka Origin-Agent-Cluster. Jeśli dodasz ją po raz pierwszy w witrynie, po prostu odświeżenie strony nie zadziała – trzeba zamknąć kartę i otworzyć nową.

Aby sprawdzić, czy nagłówek Origin-Agent-Cluster został zastosowany, użyj właściwości window.originAgentCluster w języku JavaScript. Będzie to true w przypadkach, gdy nagłówek (lub inne mechanizmy, takie jak izolacja od zasobów z innych domen) spowodowałoby stosowanie klucza źródła, false, gdy tak nie było, oraz undefined w przeglądarkach, które nie implementują nagłówka Origin-Agent-Cluster. Zapisanie tych danych na platformie analitycznej pozwoli Ci sprawdzić, 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 http://localhost. Strony HTTP inne niż lokalne nie obsługują klastrów agentów ze źródłem jako kluczem.

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

Chociaż korzystanie z klastra agentów ze źródłem jako kluczem izoluje Twój punkt początkowy od dostępu synchronicznego od stron z innych domen w tej samej witrynie, nie chroni zabezpieczeń nagłówków związanych z bezpieczeństwem, takich jak Cross-Origin-Resource-Policy i Cross-Origin-Opener-Policy. W szczególności nie jest to niezawodna ochrona przed atakami z kanałów bocznych, takich jak Spectre.

Może to być trochę zaskakujące, ponieważ klucze źródła mogą czasem powodować, że źródło treści otrzyma własny proces, a osobne procesy stanowią ważną obronę przed atakami typu side-channel. Pamiętaj jednak, że nagłówek Origin-Agent-Cluster jest tylko wskazówką w tym zakresie. Przeglądarka nie ma obowiązku udostępnienia Twojego źródła osobnego procesu i może tego nie robić z wielu powodów:

  • Przeglądarka może nie zaimplementować takiej technologii. Na przykład przeglądarki Safari i Firefox mogą obecnie umieszczać oddzielne karty w swoich procesach, ale nie mogą tego jeszcze robić w przypadku elementów iframe.

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

  • Przeglądarka może uznawać żądanie wskazane w nagłówku Origin-Agent-Cluster, ale może to zrobić przy użyciu innej technologii izolacji niż procesy. Na przykład Chrome eksploruje wątki, a nie procesy, korzystając z wątków, aby zapewnić taką izolację wydajności.

  • Użytkownik lub kod działający w innej witrynie mógł już przejść do strony z witryną jako kluczem w Twoim źródle, co spowoduje uruchomienie gwarancji spójności, a nagłówek Origin-Agent-Cluster zostanie całkowicie zignorowany.

Dlatego nie należy traktować klastrów agentów ze źródłem jako kluczem jako funkcji zabezpieczeń. Jest to sposób na pomaganie przeglądarce w określaniu priorytetów przydzielania zasobów, sugerując, że źródło zasobów skorzysta z specjalnych zasobów (i zgadzasz się zrezygnować z pewnych funkcji w zamian).

Prześlij opinię

Zespół Chrome chętnie pozna Twoją opinię, jeśli używasz nagłówka Origin-Agent-Cluster lub zastanawiasz się nad jego użyciem. Twoje interesy publiczne i wsparcie pomagają nam traktować priorytetowo funkcje i pokazać innym dostawcom przeglądarek, jak ważne są te funkcje. Napisz na @ChromiumDev i podziel się swoimi przemyśleniami i doświadczeniami z Chrome DevRel.

Jeśli masz więcej pytań na temat specyfikacji lub chcesz dowiedzieć się więcej o działaniu tej funkcji, możesz zgłosić problem w standardowym repozytorium HTML 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

Aby dowiedzieć się więcej o klastrach agentów ze źródłem jako kluczem, możesz zapoznać się ze szczegółami, korzystając z tych linków: