Leistungsisolation mit dem Header „Origin-Agent-Cluster“ anfordern

Ein neuer HTTP-Antwortheader, um domainweite Skripterstellung zu begrenzen und dedizierte Ressourcen vom Browser anzufordern.

Denicola
Domenic Denicola

Origin-Agent-Cluster ist ein neuer HTTP-Antwortheader, der den Browser anweist, den synchronen Skriptzugriff zwischen ursprungsübergreifenden Seiten derselben Website zu verhindern. Browser können Origin-Agent-Cluster auch als Hinweis verwenden, dass Ihr Ursprung eigene, separate Ressourcen erhalten sollte, z. B. einen dedizierten Prozess.

Browserkompatibilität

Derzeit ist der Origin-Agent-Cluster-Header erst ab Chrome 88 implementiert. Es wurde in enger Zusammenarbeit mit Vertretern von Mozilla Firefox entwickelt, die es als lohnendes Prototyping eingestuft haben. Es wurde vorläufig positiv von Vertretern von WebKit, der von Safari verwendeten Browser-Engine, entwickelt.

In der Zwischenzeit können Sie den Origin-Agent-Cluster-Header jedoch problemlos für alle Ihre Nutzer bereitstellen. Browser, die diese Daten nicht verstehen, ignorieren sie einfach. Und da Seiten in an den Ursprung gebundenen Agent-Clustern weniger Aktionen als an Website gebundene Aufgaben ausführen können (Standardeinstellung), gibt es kein Problem mit der Interoperabilität.

Warum Browser die gleiche Website-Ursprünge nicht automatisch trennen können

Das Web basiert auf der Same-Origin-Policy, einer Sicherheitsfunktion, die die Interaktion von Dokumenten und Skripts mit Ressourcen eines anderen Ursprungs einschränkt. Beispielsweise hat eine unter https://a.example gehostete Seite einen anderen Ursprung als der von https://b.example oder https://sub.a.example.

Im Hintergrund verwenden Browser die Trennung, die die Ursprünge ermöglichen, auf unterschiedliche Weise. Früher konnten sie, obwohl separate Ursprünge nicht auf die Daten des anderen zugreifen können, immer noch Ressourcen wie Betriebssystem-Threads, Prozesse und Arbeitsspeicherzuweisung gemeinsam nutzen. Wenn also ein Tab langsam war, würde er auch alle anderen Tabs verlangsamen. Oder wenn ein Tab zu viel Arbeitsspeicher verbraucht, würde er den gesamten Browser abstürzen.

Heutzutage sind Browser komplexer und versuchen, verschiedene Ursprünge in verschiedene Prozesse aufzuteilen. Wie genau das funktioniert, variiert je nach Browser: Die meisten Browser haben eine gewisse Trennung zwischen Tabs, aber verschiedene iFrames innerhalb eines einzelnen Tabs teilen möglicherweise denselben Prozess. Da Prozesse einen gewissen Arbeitsspeicheraufwand haben, verwenden sie Heuristiken, um zu verhindern, dass zu viele Prozesse erzeugt werden. Beispielsweise hat Firefox ein vom Nutzer konfigurierbares Prozesslimit und Chrome variiert sein Verhalten zwischen Computern (mit mehr Arbeitsspeicher) und Mobilgeräten (wo es begrenzt ist).

Diese Heuristik ist nicht perfekt. Außerdem gibt es eine wichtige Einschränkung: Da es Ausnahmen von der Richtlinie für denselben Ursprung gibt, die Subdomains wie https://sub.a.example und https://a.example die Kommunikation untereinander ermöglichen, können Browser Subdomains nicht automatisch voneinander trennen.

Dieses Standardverhalten wird als " an Websites gebundene Agent-Cluster" bezeichnet. Das bedeutet, der Browser gruppiert Seiten nach ihrer Website. Mit dem neuen Origin-Agent-Cluster-Header wird der Browser aufgefordert, dieses Standardverhalten für eine bestimmte Seite zu ändern, sodass sie in einen an origin gebundenen Agent-Cluster verschoben wird, sodass sie nur mit anderen Seiten gruppiert wird, die genau denselben Ursprung haben. Insbesondere werden ursprungsübergreifende Seiten derselben Website vom Agent-Cluster ausgeschlossen.

Durch diese Opt-in-Trennung können Browser diesen neuen an Ursprünge gebundenen Agent-Clustern ihre eigenen dedizierten Ressourcen zuweisen, die nicht mit denen anderer Ursprünge kombiniert werden. Solche Seiten könnten beispielsweise einen eigenen Prozess erhalten oder in separaten Threads geplant werden. Wenn du deiner Seite den Origin-Agent-Cluster-Header hinzufügst, weist das im Browser darauf hin, dass die Seite von solchen dedizierten Ressourcen profitieren würde.

Um die Trennung durchzuführen und diese Vorteile nutzen zu können, muss der Browser jedoch einige Legacy-Funktionen deaktivieren.

Was mit an Ursprünge gebundenen Seiten nicht möglich ist

Wenn sich Ihre Seite in einem an Ursprünge gebundenen Agent-Cluster befindet, verzichten Sie auf die Möglichkeit, mit ursprungsübergreifenden Seiten derselben Website zu kommunizieren, die zuvor verfügbar waren. Wichtig ist insbesondere:

  • Sie können document.domain nicht mehr festlegen. Dies ist eine Legacy-Funktion, mit der ursprungsübergreifende Seiten derselben Website normalerweise synchron auf das jeweils andere DOM zugreifen können. In an Ursprünge gebundenen Agent-Clustern ist sie jedoch deaktiviert.

  • Sie können über postMessage() keine WebAssembly.Module-Objekte mehr an andere ursprungsübergreifende Seiten derselben Website senden.

  • (Nur Chrome) Sie können keine SharedArrayBuffer- oder WebAssembly.Memory-Objekte mehr an andere ursprungsübergreifende Seiten derselben Website senden.

Wann sollten an Ursprünge gebundene Agent-Cluster verwendet werden?

Die folgenden Quellen profitieren am meisten vom Origin-Agent-Cluster-Header:

  • Nutzen Sie nach Möglichkeit eigene Ressourcen, um die besten Ergebnisse zu erzielen. Beispiele hierfür sind leistungsintensive Spiele, Websites für Videokonferenzen oder Apps zum Erstellen von Multimedia-Inhalten.

  • Enthält ressourcenintensive iFrames, die unterschiedlichen Ursprungs sind, aber von derselben Website stammen. Wenn https://mail.example.com beispielsweise https://chat.example.com-iFrames einbettet, sorgt die Origin-keying https://mail.example.com/ dafür, dass der vom Chatteam geschriebene Code nicht versehentlich den vom E-Mail-Team geschriebenen Code beeinträchtigen kann. Der Browser kann dann den Browser anweisen, separate Prozesse bereitzustellen, um sie unabhängig zu planen und ihre Auswirkungen auf die Leistung gegenseitig zu verringern.

  • Sie sollten auf Seiten derselben Website eingebettet werden, die unterschiedliche Herkunft haben, wissen aber, dass sie ressourcenintensiv sind. Wenn https://customerservicewidget.example.com beispielsweise davon ausgeht, viele Ressourcen für Videochats zu verwenden, und in https://*.example.com an verschiedenen Ursprüngen eingebettet wird, könnte das Team, das dieses Widget verwaltet, den Origin-Agent-Cluster-Header verwenden, um die Auswirkungen auf die Leistung auf Einbettungen zu verringern.

Außerdem musst du die oben besprochenen selten verwendeten ursprungsübergreifenden Kommunikationsfunktionen deaktivieren und dafür sorgen, dass deine Website HTTPS verwendet.

Letztlich sind dies aber nur Richtlinien. Ob Origin-keyed Agent Cluster Ihrer Website helfen oder nicht, lässt sich am besten anhand von Messungen bestimmen. Insbesondere sollten Sie Ihre Web Vitals und eventuell Ihre Arbeitsspeichernutzung messen, um festzustellen, welche Auswirkungen die Origin-Keying hat. Besonders die Arbeitsspeichernutzung ist ein potenzielles Problem, da eine höhere Anzahl von laufenden Prozessen zu mehr Arbeitsspeicheraufwand pro Prozess führen kann. Sie sollten nicht einfach Origin-Keying einführen und das Beste hoffen.

In welchem Zusammenhang steht das mit der ursprungsübergreifenden Isolierung?

Die Ursprungsschlüsselung von Agent-Clustern über den Header Origin-Agent-Cluster steht im Zusammenhang mit der ursprungsübergreifenden Isolation, ist aber über die Header Cross-Origin-Opener-Policy und Cross-Origin-Embedder-Policy von ihr getrennt.

Websites, die selbst ursprungsübergreifend isoliert sind, deaktivieren auch dieselben ursprungsübergreifenden Kommunikationsfunktionen wie bei der Verwendung des Origin-Agent-Cluster-Headers. Der Origin-Agent-Cluster-Header kann zusätzlich zur ursprungsübergreifenden Isolierung aber als zusätzlicher Hinweis für den Browser zum Ändern der Heuristik der Ressourcenzuweisung verwendet werden. Sie sollten daher trotzdem in Betracht ziehen, den Header Origin-Agent-Cluster anzuwenden und die Ergebnisse zu messen, auch auf Seiten, die bereits ursprungsübergreifend isoliert sind.

So verwenden Sie den Origin-Agent-Cluster-Header

Wenn du den Origin-Agent-Cluster-Header verwenden möchtest, konfiguriere deinen Webserver so, dass er den folgenden HTTP-Antwortheader sendet:

Origin-Agent-Cluster: ?1

Der Wert von ?1 ist die Syntax des strukturierten Headers für einen booleschen Wert true.

Es ist wichtig, diesen Header in allen Antworten von Ihrem Ursprung zu senden, nicht nur bei einigen Seiten. Andernfalls kann es zu inkonsistenten Ergebnissen kommen, bei denen sich der Browser an eine Anfrage zur Ursprungsverschlüsselung „erinnert“ und so auch auf Seiten, die nicht danach fragen, „Origin-Keys“ verwendet wird. Oder umgekehrt: Wenn die erste von einem Nutzer besuchte Seite den Header nicht enthält, merkt sich der Browser, dass Ihr Ursprung nicht an den Ursprung gebunden sein möchte, und ignoriert den Header auf nachfolgenden Seiten.

Warum kann der Browser den Header nicht immer berücksichtigen?

Der Grund für diesen „Arbeitsspeicher“ besteht darin, die Konsistenz der Codierung für einen Ursprung sicherzustellen. Wenn einige Seiten eines Ursprungs an den Ursprung gebunden waren, andere aber nicht, könntest du zwei Seiten mit demselben Ursprung haben, die in verschiedene Agent-Cluster verschoben wurden und daher nicht miteinander kommunizieren durften. Das wäre sehr seltsam, sowohl für Webentwickler als auch für das Innere des Browsers. Daher ignoriert die Spezifikation für Origin-Agent-Cluster stattdessen den Header, wenn er nicht mit dem übereinstimmt, was er zuvor für einen bestimmten Ursprung erkannt hat. In Chrome erscheint daraufhin eine Konsolenwarnung.

Diese Konsistenz ist auf eine Suchkontextgruppe beschränkt. Dabei handelt es sich um eine Gruppe von Tabs, Fenstern oder iFrames, die sich alle über Mechanismen wie window.opener, frames[0] oder window.parent gegenseitig erreichen können. Wenn also die Ursprungs- oder Website-Keying eines Ursprungs festgelegt wurden (der Browser den Header entweder sieht oder nicht sieht), muss ein völlig neuer Tab geöffnet werden, der in keiner Weise mit dem alten verbunden ist.

Diese Details können zum Testen des Origin-Agent-Cluster-Headers wichtig sein. Wenn du ihn zum ersten Mal deiner Website hinzufügst, reicht es nicht aus, die Seite einfach nur neu zu laden. Du musst den Tab schließen und einen neuen öffnen.

Mit dem JavaScript-Attribut window.originAgentCluster kannst du prüfen, ob der Origin-Agent-Cluster-Header angewendet wird. Dieser Wert ist true in Fällen, in denen der Header (oder andere Mechanismen wie ursprungsübergreifende Isolierung) die Ursprungsverschlüsselung verursacht hat, false, wenn dies nicht der Fall war, und undefined in Browsern, die den Origin-Agent-Cluster-Header nicht implementieren. Wenn Sie diese Daten auf Ihrer Analyseplattform protokollieren, können Sie prüfen, ob Sie Ihren Server richtig konfiguriert haben.

Beachten Sie außerdem, dass der Origin-Agent-Cluster-Header nur in sicheren Kontexten funktioniert, z.B. auf HTTPS-Seiten oder auf http://localhost. HTTP-Seiten ohne localhost unterstützen keine an Ursprünge gebundenen Agent-Cluster.

Die Ursprungsverschlüsselung ist keine Sicherheitsfunktion

Wenn Sie einen an Ursprünge gebundenen Agent-Cluster verwenden, wird Ihr Ursprung zwar vom synchronen Zugriff von ursprungsübergreifenden Seiten derselben Website isoliert, er bietet jedoch keinen Schutz vor sicherheitsbezogenen Headern wie Cross-Origin-Resource-Policy und Cross-Origin-Opener-Policy. Insbesondere ist es kein zuverlässiger Schutz vor Side-Channel-Angriffen wie Spectre.

Dies kann überrascht sein, da die Ursprungsverschlüsselung manchmal dazu führen kann, dass Ihr Ursprung einen eigenen Prozess erhält, und separate Prozesse eine wichtige Abwehr gegen Side-Channel-Angriffe darstellen. Denken Sie jedoch daran, dass der Header Origin-Agent-Cluster in dieser Hinsicht nur ein Hinweis ist. Der Browser ist nicht verpflichtet, Ihrem Ursprung einen separaten Prozess zuzuweisen, und dies kann auch aus verschiedenen Gründen nicht der Fall sein:

  • In einem Browser ist die entsprechende Technologie möglicherweise nicht implementiert. Derzeit können beispielsweise in Safari und Firefox separate Tabs in eigenen Prozessen eingefügt werden, bei iFrames ist das aber noch nicht möglich.

  • Dann könnte der Browser entscheiden, dass sich der Aufwand eines separaten Prozesses nicht lohnt. Auf Android-Geräten mit wenig Arbeitsspeicher oder in Android WebView verwendet Chrome beispielsweise so wenig Prozesse wie möglich.

  • Der Browser möchte die vom Origin-Agent-Cluster-Header angegebene Anfrage möglicherweise respektieren, könnte dies jedoch mit einer anderen Isolationstechnologie als Prozessen tun. Zum Beispiel verwendet Chrome Threads anstelle von Prozessen, um diese Art der Leistungsisolierung zu erforschen.

  • Möglicherweise hat der Nutzer oder Code, der auf einer anderen Website ausgeführt wird, bereits eine an eine Website gebundene Seite an Ihrem Ursprung aufgerufen, wodurch die Konsistenzgarantie aktiviert und der Origin-Agent-Cluster-Header vollständig ignoriert wird.

Aus diesen Gründen ist es wichtig, an Ursprünge gebundene Agent-Cluster nicht als Sicherheitsfunktion zu betrachten. Stattdessen ist es eine Möglichkeit, dem Browser bei der Priorisierung der Ressourcenzuweisung zu helfen, indem darauf hingewiesen wird, dass Ihr Ursprung von dedizierten Ressourcen profitieren würde (und dass Sie im Gegenzug bereit sind, auf bestimmte Funktionen zu verzichten).

Feedback

Das Chrome-Team würde gerne von Ihnen hören, ob Sie den Header Origin-Agent-Cluster verwenden oder verwenden möchten. Ihr öffentliches Interesse und Ihre Unterstützung helfen uns dabei, Funktionen zu priorisieren und anderen Browseranbietern zu zeigen, wie wichtig sie sind. Senden Sie einen Tweet an @ChromiumDev und teilen Sie Chrome DevRel Ihre Gedanken und Erfahrungen mit.

Wenn Sie weitere Fragen zur Spezifikation oder zur Funktionsweise des Features haben, können Sie ein Problem im HTML-Standard-GitHub-Repository melden. Sollten Probleme mit der Implementierung von Chrome auftreten, können Sie unter new.crbug.com einen Fehler melden. Setzen Sie dabei das Feld „Components“ auf Internals>Sandbox>SiteIsolation.

Mehr dazu

Weitere Informationen zu an Ursprüngen gebundenen Agent-Clustern erhalten Sie unter den folgenden Links: