Żą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 nie ma synchroniczny dostęp za pomocą skryptów między stronami w tej samej witrynie i z różnych domen. Przeglądarki mogą też używać Origin-Agent-Cluster, jako wskazówkę, że punkt początkowy powinien otrzymać własne, osobne zasoby, takie jak dedykowanego procesu.

Zgodność z przeglądarką

Obecnie nagłówek Origin-Agent-Cluster jest zaimplementowany tylko w Chrome 88 i nowszych. Zaprojektowano ją ścisła współpraca z przedstawicielami Mozilli Firefox, którzy uznali ją za godną prototypowanie i wynik wstępny pozytywny odbiór od przedstawicieli firmy WebKit, silnika przeglądarki używanego przez Safari.

Tymczasem nie ma problemu z wdrożeniem nagłówka Origin-Agent-Cluster w całej użytkowników już dziś. Przeglądarki, które nie rozumieją go, po prostu go zignorują. A ponieważ strony w Klastry agentów ze źródłem jako kluczem mogą wykonywać mniej działań niż te, które mają klucz witryny ( domyślnie), nie ma żadnych problemów z współdziałaniem.

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

Internet opiera się na zasadzie tego samego pochodzenia, czyli funkcji zabezpieczeń, która ogranicza sposób interakcji dokumentów i skryptów z zasobami z innego źródła origin. Na przykład strona hostowana pod adresem https://a.example znajduje się pod adresem jest inne niż w: https://b.example lub https://sub.a.example.

Za kulisami przeglądarki korzystają na różne sposoby z separacji, którą zapewniają źródła. W starym dni, mimo że oddzielne źródła nie miałyby dostępu do swoich danych, współdzielą zasoby, takie jak wątki systemu operacyjnego, procesy i alokacja pamięci. Oznacza to, że jeśli jedna karta działała wolniej, wtedy spowalniała pozostałe. Jeśli jedna karta zużywa zbyt dużo pamięci, spowoduje awarię całej przeglądarki.

Obecnie przeglądarki są bardziej wyrafinowane i starają się rozdzielać różne źródła według Sposób działania różni się w zależności od przeglądarki: większość przeglądarek korzysta z pewnego stopnia rozdzielenia ale różne elementy iframe na jednej karcie mogą mieć ten sam proces. A ponieważ procesy mają pewne zapotrzebowanie pamięci, korzystają z heurystyki, by uniknąć generowania zbyt wielu elementów. Na przykład ma limit procesów konfigurowanych przez użytkownika, i Chrome różni się w zależności od działania komputerów (gdzie masz więcej pamięci) i urządzeń mobilnych (gdzie jest rzadki).

Takie dane heurystyczne nie są doskonałe. Obowiązują ich też istotne ograniczenia: wyjątki od zasady tej samej domeny, która zezwala na subdomeny, takie jak https://sub.a.example, https://a.example, aby rozmawiać ze sobą, przeglądarki nie mogą automatycznie oddzielać subdomen od i integrację społeczną.

To domyślne działanie nosi nazwę „klastrów agentów z witryną jako kluczem”. Oznacza to, że przeglądarka grupuje strony na podstawie w swojej witrynie. Nowy nagłówek Origin-Agent-Cluster prosi przeglądarkę o zmianę tego ustawienia domyślnego dla danej strony, umieszczając ją w klastrze agentów origin, aby był zgrupowany. tylko w przypadku innych stron o dokładnie takim samym pochodzeniu. W szczególności dotyczy to stron z różnych domen w tej samej witrynie zostanie wykluczony z klastra agentów.

Taki rozdział akceptacji pozwala przeglądarkom udostępniać własne klastry agentów ze źródłem jako kluczem. dedykowane zasoby, które nie są połączone z zasobami pochodzącymi z innych źródeł. Na przykład takie strony mogą mieć swój własny proces lub planować spotkania w osobnych wątkach. Dodając parametr Origin-Agent-Cluster, wskazujesz przeglądarce, że strona została korzystanie z odpowiednich zasobów.

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 część możliwości komunikacji z tą samą witryną z innych domen, które były wcześniej dostępne. W szczególności:

  • Nie można już ustawiać document.domain To jest która normalnie pozwala stronom z tej samej witryny z innych domen na synchroniczny dostęp do każdego DOM innego, ale w klastrach agentów ze źródłem jako kluczem jest wyłączony.

  • Nie możesz już wysyłać WebAssembly.Module za pomocą postMessage().

  • (Tylko w Chrome) Nie możesz już wysyłać SharedArrayBuffer lub WebAssembly.Memory do innych stron z innych domen w tej samej 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:

  • Najlepsze wyniki uzyskasz w miarę możliwości dzięki własnym wyspecjalizowanym zasobom. Przykłady: gry, które zapewniają dużą wydajność, witryny do wideokonferencji lub 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. Na przykład, jeśli https://mail.example.com umieszcza elementy iframe (https://chat.example.com), korzystając z klucza źródła https://mail.example.com/ gwarantuje, że kod napisany przez zespół czatu nie będzie przypadkowy zakłócać działanie kodu napisanego przez zespół poczty e-mail i podpowiadać przeglądarce, aby dodała aby zaplanować je niezależnie od siebie i zmniejszyć ich wpływ na wydajność.

  • powinny być umieszczone na stronach w tej samej witrynie pochodzącej z innego źródła, ale muszą być dużo zasobów. Jeśli na przykład https://customerservicewidget.example.com spodziewa się użyć tagu wiele zasobów do czatów wideo, które będą pojawiać się w różnych miejscach https://*.example.com, zespół obsługujący ten widżet może użyć komponentu Origin-Agent-Cluster w nagłówku, by zmniejszyć ich wpływ na działanie elementów umieszczonych na stronie.

Upewnij się też, że zgadzasz się na wyłączenie omówionych powyżej rzadko używanych funkcji komunikacji z innych domen, a Twoja witryna używa HTTPS.

Ostatecznie to tylko wytyczne. Czy klastry agentów ze źródłem jako kluczem pomogą Twojej witrynie zależy od wyników pomiarów. Zwróć szczególną uwagę na pomiar wskaźniki internetowe i potencjalnie pamięć, , aby sprawdzić, jaki wpływ ma stosowanie klucza źródła. (Wykorzystanie pamięci w jest potencjalnym problemem, ponieważ rosnąca liczba procesów narzut pamięci na proces). 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?

Łączenie kluczy ze źródła w przypadku klastrów agentów za pomocą nagłówka Origin-Agent-Cluster jest związane z, ale niezależnymi z izolacji od zasobów z innych domen za pomocą tagów Cross-Origin-Opener-Policy oraz Nagłówki Cross-Origin-Embedder-Policy.

Każda witryna, która izoluje się od zasobów z innych domen, również wyłącza tę samą witrynę z innych domen funkcje komunikacyjne, tak jak w przypadku nagłówka Origin-Agent-Cluster. Jednak Oprócz izolacji od zasobów z innych domen nagłówek Origin-Agent-Cluster może być nadal przydatny wskazówkę dla przeglądarki, aby zmienić heurystykę alokacji zasobów. Dlatego nadal warto wziąć pod uwagę używając nagłówka Origin-Agent-Cluster i mierzyć wyniki, nawet na stronach, które izolowane od zasobów z innych domen.

Jak używać nagłówka Origin-Agent-Cluster

Aby użyć nagłówka Origin-Agent-Cluster, skonfiguruj swój serwer WWW, aby wysyłał następujący kod HTTP nagłówek odpowiedzi:

Origin-Agent-Cluster: ?1

Wartość ?1 to struktura nagłówek dla 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ą pojawić się niespójne wyniki, które przeglądarka „zapamiętuje” wyświetlanie klucza źródłowego więc otrzymuje klucze origin nawet na stronach, które o to nie proszą. Albo na odwrót: jeśli na pierwszej stronie użytkownik nie ma nagłówka, przeglądarka zapamięta, do źródła jako klucza i będzie ignorować nagłówek na kolejnych stronach.

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

Przyczyna tej „pamięci” jest zapewnienie spójności kluczy dla źródła. Jeśli niektóre strony w w przypadku źródła jako źródła jako klucza, podczas gdy inne nie, możesz mieć 2 strony umieszczono w różnych klastrach agentów, przez co nie mogli się ze sobą komunikować. Byłoby to bardzo dziwne zarówno dla programistów stron internetowych, jak i dla wewnętrznych przeglądarek. Specyfikacja w polu Origin-Agent-Cluster zamiast tego ignoruje nagłówek, jeśli jest niezgodny z wcześniejszym wynikiem. dla danego punktu początkowego. 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 elementów iframe, które mogą się docierać do siebie za pomocą takich mechanizmów jak window.opener, frames[0] lub window.parent Oznacza to, że po ustaleniu zasad dotyczących źródła lub witryny jako klucza witryny (przez widzi go lub go nie widzi), jego zmiana wymaga otwarcia zupełnie nowego i w żaden sposób nie jest z nią połączona.

Te informacje mogą być ważne przy testowaniu nagłówka Origin-Agent-Cluster. Podczas dodawania go po raz pierwszy do Twojej witryny, samo odświeżenie strony nic nie da, Zamknij kartę i otwórz nową jeden.

Aby sprawdzić, czy nagłówek Origin-Agent-Cluster został zastosowany, użyj JavaScriptu window.originAgentCluster. Będzie to true w przypadku, gdy nagłówek (lub inny element) mechanizmy takie jak izolacja zasobów z innych domen) powodują stosowanie klucza źródła; false gdy tak się nie stało. i undefined w przeglądarkach, które nie mają nagłówka Origin-Agent-Cluster. Zapisanie tych danych na platformie analitycznej może przynieść cenną kontrolę, serwera.

Pamiętaj też, że nagłówek Origin-Agent-Cluster działa tylko z elementami bezpiecznymi kontekstach, np.HTTPS. lub w witrynie http://localhost. Strony HTTP spoza lokalnego hosta nie obsługują agenta ze źródłem jako kluczem klastrów.

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

Jeśli używany klaster agentów ze źródłem jako kluczem odizoluje źródło od dostępu synchronicznego z między stronami z tej samej witryny, nie zapewnia ochrony związane z bezpieczeństwem, takie jak Cross-Origin-Resource-Policy. oraz 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 może czasem powodować, że Twoje źródło staje się własne. a oddzielne procesy są ważną obroną przed atakami typu side-channel. Pamiętaj jednak, że nagłówek Origin-Agent-Cluster jest tylko wskazówką. Przeglądarka nie jest musisz przekazać swojemu źródłom osobny proces. Może się to nie stać z różnych powodów:

  • Przeglądarka może nie wdrożyć odpowiedniej technologii. Na przykład obecnie Safari i Firefox można umieścić oddzielne karty w osobnych procesach, ale na razie nie można tego zrobić w przypadku elementów iframe.

  • Przeglądarka może uznać, że nie warto wykonywać osobnego procesu. Na przykład na stronie urządzeń 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ędnić żądanie, które wskazuje nagłówek Origin-Agent-Cluster, ale można to osiągnąć przy użyciu innej technologii izolacji niż procesy. Na przykład Chrome to eksploracja używając wątków, a nie procesów.

  • Użytkownik lub kod działający w innej witrynie mógł już przejść na stronę z witryną jako kluczem. w źródle, przez co gwarancja spójności zaczyna się Origin-Agent-Cluster do całkowitego zignorowania.

Z tego powodu klastry agentów ze źródłem jako kluczem nie należy traktować jako funkcji zabezpieczeń. Jest to sposób na ułatwienie przeglądarce priorytetowego przydzielania zasobów przez sugerowanie, że czerpaliby korzyści ze specjalnych zasobów (i że zgodzisz się zrezygnować z określonych funkcje).

Prześlij opinię

Zespół Chrome chętnie pozna Twoją opinię, jeśli używacie Origin-Agent-Cluster lub rozważa jego użycie nagłówek. Twoje interesy publiczne i Twoje wsparcie pomagają nam traktować priorytetowo funkcje i wyświetlać inne dostawców przeglądarek. Tweetuj na stronie @ChromiumDev i podziel się swoimi przemyśleniami i doświadczeniami w Chrome DevRel.

Jeśli masz więcej pytań na temat specyfikacji lub szczegółów działania funkcji, zgłosić problem w repozytorium HTML Standard na GitHubie. A jeśli napotkanych problemów z implementacją Chrome, możesz zgłosić błąd na stronie new.crbug.com z polem Komponenty ustawionym na Internals>Sandbox>SiteIsolation.

Więcej informacji

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