Webentwicklung
COOP
COOP (Cross-Origin Opener Policy) ist ein HTTP-Response-Header, der kontrolliert, ob eine Seite einen Browsing-Kontext mit Seiten anderer Origins teilt. Öffnet eine Seite über window.open() eine andere, regelt COOP, ob beide gegenseitig window-Referenzen behalten. Durch Kappen dieser Referenz verhindert COOP Spectre-basierte Angriffe über das Window-Objekt. Der Header kennt drei Werte: unsafe-none (Standard, keine Einschränkung), same-origin-allow-popups (die Seite ist isoliert, selbst geöffnete…
Was ist COOP?
COOP (Cross-Origin Opener Policy) ist ein HTTP-Response-Header, der kontrolliert, ob eine Seite einen Browsing-Kontext mit Seiten anderer Origins teilen darf. Konkret: Wenn Seite A (cross-origin) Seite B über window.open() öffnet, ob A dann noch eine window-Referenz zu B hat und umgekehrt. Mit COOP kann Seite B diese Referenz kappen — was Spectre-basierte Angriffe über das Window-Objekt verhindert.
Für Cross-Origin Isolation (der zweite Teil des Pakets nach COEP) ist COOP: same-origin Pflicht. Beide Header zusammen versetzen eine Seite in Cross-Origin Isolation und machen SharedArrayBuffer sowie präzise Timer verfügbar.
Wie funktioniert COOP?
Drei Werte stehen zur Verfügung:
unsafe-none(Standard): Keine Einschränkungen — fremde Seiten die überwindow.open()geöffnet werden, behalten gegenseitig Zugriff auf ihrewindow-Objekte.same-origin-allow-popups: Die aktuelle Seite ist isoliert, aber selbst geöffnete Popups (eigene Origin) behalten die Window-Referenz. Nützlich für OAuth-Flows, bei denen ein eigener Popup den Token zurückschicken soll.same-origin: Vollständige Isolation. Sowohl von Fremd-Seiten geöffnete als auch selbst geöffnete cross-origin Popups verlieren die Window-Referenz. Notwendig für Cross-Origin Isolation.
Der typische Cross-Origin-Isolation-Setup:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp Nach dem Setzen beider Header ist self.crossOriginIsolated === true, und SharedArrayBuffer sowie Atomics sind verfügbar.
COOP in der Praxis
Das häufigste Praxisproblem mit COOP: OAuth-Popup-Flows brechen. Wenn ein Login-Popup (accounts.google.com, twitter.com) über window.open() geöffnet wird und nach dem Login über window.opener.postMessage() den Token zurückschickt, funktioniert das nicht mehr mit COOP: same-origin — weil die Window-Referenz gekappt wurde.
Lösung: same-origin-allow-popups als Kompromiss — eigene Popups behalten die Referenz, fremde Seiten sind trotzdem isoliert. Oder: Redirect-Flow statt Popup für OAuth nutzen.
# Nginx: COOP Header setzen
add_header Cross-Origin-Opener-Policy "same-origin-allow-popups" always; Was passiert wenn COOP falsch konfiguriert ist?
COOP: same-origin auf einer WordPress-Admin-Seite, die Social-Login-Plugins mit Popup-Flow verwendet (Google, Facebook, Twitter/X Login), bricht den Login-Flow sofort. Der Popup öffnet sich, der Nutzer autorisiert — aber die Seite bekommt keinen Token zurück, weil window.opener null ist.
Auch WordPress-Plugins, die Modal-Iframes aus externen Domains verwenden (z.B. Payment-Provider, Video-Embed-Dialoge), können betroffen sein.
Häufige Fragen
Muss ich COOP setzen, auch wenn ich kein SharedArrayBuffer brauche? Nein. Ohne Bedarf an Cross-Origin Isolation ist COOP nicht notwendig. Als allgemeine Härtungsmaßnahme kann same-origin-allow-popups sinnvoll sein — es verhindert, dass fremde Seiten eine Window-Referenz zu deiner Seite halten.
Kann Reporting-Only-Modus genutzt werden? Ja: Cross-Origin-Opener-Policy-Report-Only ermöglicht das Testen ohne tatsächliche Blockierung. Violations werden an einen definierten Reporting-Endpoint gesendet.
Wie prüfe ich ob Cross-Origin Isolation aktiv ist? In der Browser-Konsole: console.log(self.crossOriginIsolated). Gibt true zurück, wenn sowohl COOP: same-origin als auch COEP: require-corp (oder credentialless) gesetzt sind.
Verwandte Begriffe
COOP in drei Sätzen
COOP (Cross-Origin Opener Policy) ist ein HTTP-Response-Header, der kontrolliert, ob eine Seite einen Browsing-Kontext mit Seiten anderer Origins teilt. Öffnet eine Seite über window.open() eine andere, regelt COOP, ob beide gegenseitig window-Referenzen behalten. Durch Kappen dieser Referenz verhindert COOP Spectre-basierte Angriffe über das Window-Objekt. Der Header kennt drei Werte: unsafe-none (Standard, keine Einschränkung), same-origin-allow-popups (die Seite ist isoliert, selbst geöffnete…