Cross-Origin Headers für Nginx
COOP, CORP und optional COEP auf Nginx einrichten — mit der add_header-Direktive, differenzierten location-Blöcken und fertigen Konfigurationen zum Kopieren.
Cross-Origin Headers auf Nginx
Nginx ist der weltweit meistgenutzte Webserver und unterstützt Cross-Origin Headers nativ über die add_header-Direktive — ohne zusätzliche Module. Das always-Keyword stellt sicher, dass die Header auch bei Fehlerseiten (404, 500) gesetzt werden, was für durchgängigen Schutz entscheidend ist.
Diese Anleitung zeigt die Implementierung in drei Schritten: COOP für Fenster-Isolation, CORP für Ressourcenschutz und optional COEP für vollständige Cross-Origin Isolation. Nginx erlaubt differenzierte Konfiguration nach location-Blöcken — ideal, um öffentliche Assets und geschützte APIs unterschiedlich zu behandeln. Cross-Origin Headers bringen 30 von 166 Punkten im Wolf-Agents Web Security Check.
COOP konfigurieren — Fenster-Isolation aktivieren
Cross-Origin-Opener-Policy isoliert Ihr Browser-Fenster von anderen Tabs und Popups. Der Wert same-origin-allow-popups ist der empfohlene Einstieg: Er schützt vor window.opener-Manipulation, erlaubt aber weiterhin OAuth-Popups und Payment-Fenster.
server {
# Cross-Origin-Resource-Policy
add_header Cross-Origin-Resource-Policy "same-site" always;
# Cross-Origin-Opener-Policy
add_header Cross-Origin-Opener-Policy "same-origin-allow-popups" always;
# Cross-Origin-Embedder-Policy (vorsichtig einsetzen)
# add_header Cross-Origin-Embedder-Policy "require-corp" always;
} always? Ohne das always-Keyword setzt Nginx den Header nur bei erfolgreichen Responses (2xx/3xx). Fehlerseiten (404, 500) erhalten keinen Cross-Origin-Header — Angreifer könnten gezielt Fehlerseiten nutzen, um den Schutz zu umgehen.
same-origin-allow-popups vs. same-origin Mit same-origin-allow-popups funktionieren OAuth-Flows (Google, GitHub Login) und Payment-Popups weiterhin. same-origin bietet maximale Isolation, kann aber solche Flows brechen. Starten Sie mit same-origin-allow-popups.
CORP hinzufügen — Ressourcen-Zugriff kontrollieren
Cross-Origin-Resource-Policy kontrolliert, welche Origins Ihre Ressourcen laden dürfen. Nginx erlaubt differenzierte Konfiguration nach location-Block: öffentliche Assets mit cross-origin, geschützte APIs mit same-origin.
# Öffentliche Assets
location /assets/ {
add_header Cross-Origin-Resource-Policy "cross-origin" always;
}
# Geschützte API
location /api/ {
add_header Cross-Origin-Resource-Policy "same-origin" always;
}
# Statische Dateien
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
add_header Cross-Origin-Resource-Policy "cross-origin" always;
} CORP-Werte im Überblick
same-origin
Nur die eigene Origin darf die Ressource laden. Maximal restriktiv — ideal für APIs und sensible Daten.
same-site
Alle Subdomains der gleichen Site dürfen laden. Guter Kompromiss für die meisten Websites mit Subdomains.
cross-origin
Jede Origin darf die Ressource laden. Für öffentliche Assets wie Bilder, CSS und JavaScript auf CDNs.
add_header-Direktiven in einem location-Block alle Header des übergeordneten server-Blocks. Setzen Sie daher alle benötigten Header auch in jedem location-Block. COEP optional aktivieren und testen
Cross-Origin-Embedder-Policy mit require-corp erzwingt, dass alle eingebetteten Ressourcen einen CORP- oder CORS-Header senden. Nur aktivieren, wenn Sie SharedArrayBuffer oder vollständige Cross-Origin Isolation benötigen.
server {
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
} require-corp blockiert alle externen Ressourcen ohne CORP- oder CORS-Header — darunter Google Fonts, YouTube-Embeds, Google Maps und CDN-Bilder. Testen Sie gründlich, bevor Sie COEP aktivieren. # 1. Konfiguration prüfen und Nginx neu laden
sudo nginx -t && sudo systemctl reload nginx
# 2. Cross-Origin Header prüfen
curl -sI https://example.com | grep -i cross-origin
# Erwartete Ausgabe:
# cross-origin-opener-policy: same-origin-allow-popups
# cross-origin-resource-policy: same-site credentialless Cross-Origin-Embedder-Policy: credentialless (Chrome 96+, Firefox 119+) ist weniger streng als require-corp und bricht seltener Drittanbieter-Ressourcen. Allerdings unterstützt Safari credentialless nicht.
Wie steht Ihre Domain bei Cross-Origin Headers?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.
Häufig gestellte Fragen
Warum brauche ich das always-Keyword bei add_header?
Ohne always setzt Nginx den Header nur bei erfolgreichen Responses (2xx/3xx). Fehlerseiten (404, 500) erhalten keinen Cross-Origin-Header — das ist ein Sicherheitsrisiko. Mit always wird der Header bei allen Statuscodes gesetzt, auch bei Fehlerseiten.
Kann ich CORP differenziert nach location setzen?
Ja. Nginx erlaubt add_header pro location-Block. Setzen Sie Cross-Origin-Resource-Policy auf "cross-origin" für öffentliche Assets (/assets/, Bilder) und auf "same-origin" für geschützte API-Endpunkte. So schützen Sie sensible Daten, ohne öffentliche Ressourcen zu blockieren.
Muss ich Nginx nach der Änderung neu starten?
Ein Reload genügt — nginx -t prüft die Syntax, systemctl reload nginx lädt die Konfiguration ohne Unterbrechung aktiver Verbindungen. Ein vollständiger Neustart (restart) ist nicht nötig.
Funktionieren Cross-Origin Headers mit Nginx als Reverse Proxy?
Ja. Setzen Sie die Header am Edge (im Nginx-Server-Block), nicht am Backend. Wenn Nginx als Reverse Proxy vor einer Anwendung steht, erreichen die Header den Browser über Nginx — unabhängig davon, ob das Backend die Header selbst setzt.
Was passiert, wenn ich COEP auf require-corp setze?
COEP mit require-corp blockiert alle externen Ressourcen ohne CORP- oder CORS-Header — darunter Google Fonts, YouTube-Embeds, Google Maps und CDN-Bilder. Aktivieren Sie COEP erst nach gründlichem Testen oder verwenden Sie credentialless als weniger strenge Alternative.
Brauche ich alle drei Header gleichzeitig auf Nginx?
Nein. COOP und CORP sind einzeln einsetzbar und risikoarm. Starten Sie mit COOP (same-origin-allow-popups) und CORP (same-site). COEP wird nur benötigt, wenn Sie SharedArrayBuffer oder vollständige Cross-Origin Isolation brauchen.