Cross-Origin Headers für Shopware 6

CORP, COEP und COOP per EventSubscriber — Spectre-Schutz mit Vorsicht bei Payment-iFrames und externen Integrationen.

Shopware · Schritt für Schritt

Cross-Origin Headers in Shopware 6

Cross-Origin Headers (COOP, COEP, CORP) schützen vor Spectre-Seitenkanal-Angriffen und kontrollieren, wie Ihre Website mit Cross-Origin-Ressourcen interagiert. Mit 30 von 166 Punkten haben diese Header den zweitgrößten Einzeleinfluss auf die Wolf-Agents Web Security Note nach der Content Security Policy.

Für Shopware-Shops ist die Konfiguration besonders anspruchsvoll: Payment-Provider wie PayPal, Stripe, Klarna und Mollie nutzen iFrames und Cross-Origin-Requests für ihre Zahlungsformulare. Ein zu restriktives Cross-Origin-Embedder-Policy: require-corp blockiert diese iFrames vollständig — der Checkout funktioniert nicht mehr. Die sichere Empfehlung: COOP: same-origin und CORP: same-origin sind immer sicher. Für COEP nutzen Sie credentialless als Kompromiss zwischen Sicherheit und Kompatibilität.

Die Unterscheidung zwischen require-corp, credentialless und unsafe-none bei COEP ist entscheidend: require-corp bietet den höchsten Schutz, blockiert aber alle Cross-Origin-Ressourcen ohne CORP-Header. credentialless erlaubt Cross-Origin-Ressourcen ohne Credentials und ist mit den meisten Payment-Providern kompatibel. unsafe-none deaktiviert COEP vollständig. Der Wolf-Agents Web Security Scanner bewertet alle drei Cross-Origin-Header differenziert.

Implementierung

Variante A: EventSubscriber mit COOP, CORP und COEP credentialless. Variante B: Nginx für Self-Hosted. Variante C: Fortgeschritten — COEP differenziert nach Route (credentialless auf normalen Seiten, unsafe-none auf Checkout).

Variante A — EventSubscriber
SecurityHeaderSubscriber.phpEmpfohlen
// SecurityHeaderSubscriber.php — Cross-Origin Headers
public function onResponse(ResponseEvent $event): void
{
    $response = $event->getResponse();

    // COOP — Isolierung von Window-Referenzen
    // Sicher für alle Seiten, auch mit Payment-Popups
    $response->headers->set(
        'Cross-Origin-Opener-Policy',
        'same-origin'
    );

    // CORP — Ressourcen nur für Same-Origin
    // Verhindert Einbettung Ihrer Bilder/Scripts auf fremden Seiten
    $response->headers->set(
        'Cross-Origin-Resource-Policy',
        'same-origin'
    );

    // COEP — credentialless ist sicherer als unsafe-none
    // aber kompatibler als require-corp
    $response->headers->set(
        'Cross-Origin-Embedder-Policy',
        'credentialless'
    );
}
Variante B — Nginx
nginx.confServer-Level
# Nginx — Alternative für Self-Hosted
# COOP und CORP sind sicher, COEP mit Vorsicht

add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;

# COEP: credentialless als Kompromiss
# Erlaubt Cross-Origin-Ressourcen ohne Credentials
add_header Cross-Origin-Embedder-Policy "credentialless" always;

# Falls Payment-Provider Probleme machen:
# COEP auf Checkout-Seiten deaktivieren
# location ~ ^/checkout {
#     add_header Cross-Origin-Embedder-Policy "unsafe-none" always;
# }
Variante C — Route-basiert
SecurityHeaderSubscriber.phpFortgeschritten
// Fortgeschritten: COEP nur auf Nicht-Checkout-Seiten
public function onResponse(ResponseEvent $event): void
{
    $request = $event->getRequest();
    $response = $event->getResponse();
    $path = $request->getPathInfo();

    // COOP und CORP: immer setzen (sicher)
    $response->headers->set('Cross-Origin-Opener-Policy', 'same-origin');
    $response->headers->set('Cross-Origin-Resource-Policy', 'same-origin');

    // COEP: credentialless auf allen Seiten AUSSER Checkout
    if (!str_starts_with($path, '/checkout')) {
        $response->headers->set(
            'Cross-Origin-Embedder-Policy',
            'credentialless'
        );
    } else {
        // Checkout: unsafe-none für Payment-Provider
        $response->headers->set(
            'Cross-Origin-Embedder-Policy',
            'unsafe-none'
        );
    }
}
COEP credentialless vs. require-corp

credentialless ist seit Chrome 96 verfügbar und löst das größte Problem von COEP: Es erlaubt Cross-Origin-Ressourcen ohne CORP-Header, solange sie keine Credentials (Cookies) senden. Das funktioniert mit den meisten Payment-Provider-iFrames. require-corp blockiert dagegen alles ohne expliziten CORP-Header — PayPal, Stripe, Klarna und Mollie setzen keinen CORP-Header auf ihren Scripts. Nutzen Sie credentialless als optimalen Kompromiss.

Verifizierung

Prüfen Sie die Header auf verschiedenen Seiten und testen Sie den kompletten Payment-Flow. Cross-Origin-Probleme zeigen sich oft erst beim Bezahlen — testen Sie jeden aktiven Payment-Provider (PayPal, Stripe, Klarna, etc.) einzeln durch.

TerminalVerifizierung
# 1. Cache leeren
bin/console cache:clear

# 2. Cross-Origin Headers auf der Startseite prüfen
curl -sI https://ihr-shop.de | grep -i cross-origin
# Erwartete Ausgabe:
# cross-origin-opener-policy: same-origin
# cross-origin-resource-policy: same-origin
# cross-origin-embedder-policy: credentialless

# 3. Checkout-Seite prüfen (COEP kann anders sein)
curl -sI https://ihr-shop.de/checkout/cart | grep -i cross-origin

# 4. Payment-Flow vollständig testen
# → PayPal: Popup öffnet sich korrekt?
# → Stripe: Karteneingabe-iFrame lädt?
# → Klarna: Widget wird angezeigt?

# 5. Browser DevTools: Console auf Fehler prüfen
# → "blocked by COEP" = COEP zu restriktiv
Tipp: Testen Sie Cross-Origin-Header immer in einer Staging-Umgebung mit echten Payment-Provider-Sandbox-Keys. Ein fehlschlagender Checkout auf der Live-Seite verursacht direkten Umsatzverlust.

Häufige Fehler

COEP blockiert Payment-Provider-iFrames

Cross-Origin-Embedder-Policy: require-corp blockiert alle Cross-Origin-Ressourcen ohne CORP-Header. PayPal, Stripe, Klarna und Mollie senden keinen CORP-Header auf ihren Scripts. Lösung: credentialless nutzen oder COEP auf Checkout-Seiten auf unsafe-none setzen.

CDN-Bilder von CORP blockiert

Mit CORP: same-origin werden Bilder von externen CDNs (Bunny.net, Cloudflare) blockiert, wenn das CDN eine andere Domain hat. Lösung: CDN als Subdomain konfigurieren (z.B. cdn.ihr-shop.de) oder CORP: cross-origin setzen. Letzteres erlaubt die Einbettung Ihrer Ressourcen auf fremden Seiten.

Google Fonts und Tracking-Scripts blockiert

COEP blockiert auch Google Fonts, Analytics und andere externe Scripts. Alle externen Ressourcen benötigen entweder einen CORP-Header oder ein crossorigin-Attribut im HTML-Tag. Prüfen Sie die Browser-Console auf "blocked by COEP"-Fehler nach der Aktivierung.

PayPal-Popup öffnet sich nicht

COOP: same-origin isoliert Window-Referenzen. PayPal öffnet ein Popup-Fenster für die Authentifizierung. In manchen Fällen kann same-origin die Kommunikation zwischen Popup und Shop-Fenster stören. Testen Sie den PayPal-Flow gründlich. Fallback: COOP: same-origin-allow-popups.

Compliance-Relevanz

NIS2 Art. 21(e) — Schutz vor Spectre-Seitenkanal-Angriffen durch Prozess-Isolierung. Cross-Origin-Header sind die browserbasierte Verteidigung gegen diese Hardware-Schwachstelle.
PCI DSS 4.0 Requirement 6.2.4 — Cross-Origin-Isolierung schützt Zahlungsformulare vor Cross-Site-Datenexfiltration. Besonders relevant für Shops mit eingebetteten Payment-Widgets.
BSI APP.3.1 — Cross-Origin-Isolierung als fortgeschrittene Sicherheitsmaßnahme. Das BSI empfiehlt die Aktivierung aller verfügbaren Browser-Isolierungsmechanismen.
OWASP ASVS V14.4 — Cross-Origin-Header für maximale Browser-Sicherheit. COOP, COEP und CORP bilden zusammen die stärkste Browser-Isolierung gegen Seitenkanal-Angriffe.

Wie steht Ihre Domain bei Cross-Origin Headers?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.