COOP
Cross-Origin Opener Policy — HTTP-Header, der eine Seite von fremden Browsing-Kontexten isoliert und damit Spectre-Angriffe über window-Referenzen verhindert.
Aktualisiert: 23. Februar 2026
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.
Kurzprofil
- Typ: HTTP-Response-Header (Sicherheits-Policy)
- Header:
Cross-Origin-Opener-Policy - Werte:
unsafe-none(Standard),same-origin-allow-popups,same-origin - Spezifikation: HTML Standard (WHATWG)
- Relevant zusammen mit: COEP
- Relevanz für WordPress/Web: Niedrig (außer bei OAuth/Popup-Flows)
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;
Das Wichtigste
- COOP isoliert eine Seite von fremden Browsing-Kontexten (Window-Objekte)
same-originist notwendig für Cross-Origin Isolation (zusammen mit COEP)same-origin-allow-popupsist die pragmatische Variante für Seiten mit OAuth-Popups- OAuth-Popup-Flows müssen auf Redirect-Flow umgestellt oder
same-origin-allow-popupsgewählt werden - Für Standard-WordPress ohne WebAssembly/Audio selten relevant
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
CORP · HTTP