← Zurück zum Glossar
webentwicklung

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 COOP

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 über window.open() geöffnet werden, behalten gegenseitig Zugriff auf ihre window-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;
Auf einen Blick

Das Wichtigste

  • COOP isoliert eine Seite von fremden Browsing-Kontexten (Window-Objekte)
  • same-origin ist notwendig für Cross-Origin Isolation (zusammen mit COEP)
  • same-origin-allow-popups ist die pragmatische Variante für Seiten mit OAuth-Popups
  • OAuth-Popup-Flows müssen auf Redirect-Flow umgestellt oder same-origin-allow-popups gewä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

start call_