Cross-Origin Headers für Astro konfigurieren

Schritt-für-Schritt-Anleitung: COOP, CORP und COEP per Middleware konfigurieren -- Spectre-Schutz mit Island-Kompatibilität.

Astro · Fortgeschritten

Cross-Origin Headers in Astro

Die Cross-Origin Headers (COOP, CORP, COEP) schützen gegen Spectre-Seitenkanalangriffe, indem sie die Prozess-Isolation im Browser erzwingen. Sie sind mit 30 von 166 Punkten der zweitwichtigste Header-Block im Wolf-Agents Web Security Check.

Cross-Origin-Opener-Policy (COOP) isoliert Browsing-Kontexte. Cross-Origin-Resource-Policy (CORP) schützt Ressourcen vor Cross-Origin-Einbettung. Cross-Origin-Embedder-Policy (COEP) stellt sicher, dass alle eingebetteten Ressourcen explizit Cross-Origin-Zugriff erlauben. In Astro konfigurieren Sie alle drei per Middleware.

COEP erfordert besondere Aufmerksamkeit bei Astro-Projekten: Islands, die externe Ressourcen laden (Google Fonts, CDN-Images, Third-Party-Widgets), können durch require-corp blockiert werden. Verwenden Sie credentialless als pragmatische Alternative.

1Schritt 1 von 5

COOP und CORP per Middleware (SSR)

Setzen Sie Cross-Origin-Opener-Policy: same-origin und Cross-Origin-Resource-Policy: same-origin. Diese beiden Header haben keine Nebenwirkungen bei typischen Astro-Websites und sollten immer gesetzt werden.

src/middleware.tsSSR
// src/middleware.ts -- Cross-Origin Headers (SSR)
import { defineMiddleware } from 'astro:middleware';

export const onRequest = defineMiddleware(async (context, next) => {
  const response = await next();

  // Cross-Origin-Opener-Policy: Browsing-Kontexte isolieren
  response.headers.set('Cross-Origin-Opener-Policy', 'same-origin');

  // Cross-Origin-Resource-Policy: Ressourcen vor Einbettung schützen
  response.headers.set('Cross-Origin-Resource-Policy', 'same-origin');

  // COEP: Vorsicht bei externen Ressourcen!
  // response.headers.set('Cross-Origin-Embedder-Policy', 'require-corp');

  return response;
});
2Schritt 2 von 5

COEP: credentialless vs. require-corp

COEP ist optional, aber notwendig für Features wie SharedArrayBuffer und hochpraezise Timer. Verwenden Sie credentialless statt require-corp, wenn Ihre Astro-App externe Ressourcen einbettet. Für OAuth-Login-Seiten setzen Sie COOP: same-origin-allow-popups, um Popup-Kommunikation zu erhalten.

src/middleware.tsCOEP credentialless
// src/middleware.ts -- COEP mit credentialless (weniger restriktiv)
import { defineMiddleware } from 'astro:middleware';

export const onRequest = defineMiddleware(async (context, next) => {
  const response = await next();

  response.headers.set('Cross-Origin-Opener-Policy', 'same-origin');
  response.headers.set('Cross-Origin-Resource-Policy', 'same-origin');

  // credentialless erlaubt Cross-Origin-Ressourcen ohne CORP-Header
  // Ermöglicht SharedArrayBuffer und high-resolution Timer
  response.headers.set('Cross-Origin-Embedder-Policy', 'credentialless');

  return response;
});
src/middleware.tsOAuth-Popup
// src/middleware.ts -- COOP mit OAuth-Popup-Kompatibilität
export const onRequest = defineMiddleware(async (context, next) => {
  const response = await next();
  const url = new URL(context.request.url);

  // Login-Seite braucht Popup-Kommunikation (OAuth)
  if (url.pathname.startsWith('/login')) {
    response.headers.set('Cross-Origin-Opener-Policy',
      'same-origin-allow-popups');
  } else {
    response.headers.set('Cross-Origin-Opener-Policy',
      'same-origin');
  }

  response.headers.set('Cross-Origin-Resource-Policy', 'same-origin');
  return response;
});
3Schritt 3 von 5

SSG-Hosting-Varianten

Für statische Deployments setzen Sie die Cross-Origin Headers auf dem Webserver oder der Hosting-Plattform. Die Header gelten für alle Responses -- eine pfadbasierte Differenzierung ist auf dem Webserver weniger flexibel als in der Middleware.

nginx.confNginx
# Nginx -- Cross-Origin Headers (SSG)
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;

# COEP nur aktivieren, wenn keine externen Ressourcen geladen werden:
# add_header Cross-Origin-Embedder-Policy "require-corp" always;
# Alternative mit besserer Kompatibilität:
# add_header Cross-Origin-Embedder-Policy "credentialless" always;
vercel.jsonVercel
// vercel.json -- Cross-Origin Headers
{
  "headers": [{
    "source": "/(.*)",
    "headers": [
      { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" },
      { "key": "Cross-Origin-Resource-Policy", "value": "same-origin" }
    ]
  }]
}
4Schritt 4 von 5

Verifizieren und Islands testen

Prüfen Sie die Header und testen Sie alle Astro Islands. Öffnen Sie die Browser DevTools und prüfen Sie die Console auf Cross-Origin-Fehler. Laden Sie jede Seite mit Islands und prüfen Sie, ob externe Ressourcen korrekt geladen werden.

TerminalVerifizieren
# Cross-Origin Headers prüfen
curl -sI https://ihre-domain.de | grep -i cross-origin

# Erwartete Ausgabe:
# Cross-Origin-Opener-Policy: same-origin
# Cross-Origin-Resource-Policy: same-origin

# Cross-Origin-Isolation prüfen (Browser-Console)
# window.crossOriginIsolated === true
5Schritt 5 von 5

Cross-Origin-Isolation prüfen

Wenn COOP und COEP korrekt gesetzt sind, aktiviert der Browser Cross-Origin-Isolation. Das ermöglicht Features wie SharedArrayBuffer und hochpraezise Timer (performance.now() mit Mikrosekunden-Aufloesung), schützt aber gleichzeitig vor Spectre-Angriffen.

Prüfen Sie den Isolation-Status in der Browser-Console: window.crossOriginIsolated gibt true zurück, wenn die Isolation aktiv ist. Für die meisten Astro-Websites ist Cross-Origin-Isolation kein Muss -- COOP und CORP allein bieten bereits substanziellen Schutz.

Wolf-Agents setzt COOP und CORP auf same-origin, aktiviert COEP aber nicht, da externe Monitoring-Ressourcen geladen werden. Die Empfehlung für die meisten Astro-Projekte: Setzen Sie COOP und CORP immer, COEP nur wenn alle externen Ressourcen unter Ihrer Kontrolle sind.

Häufige Fehler bei Cross-Origin Headers in Astro

COEP blockiert Google Fonts

require-corp blockiert alle Cross-Origin-Ressourcen ohne CORP-Header. Google Fonts sendet keinen CORP-Header. Verwenden Sie credentialless oder hosten Sie Fonts selbst (was auch für DSGVO besser ist).

OAuth-Popup funktioniert nicht

COOP: same-origin unterbricht die Kommunikation zwischen Haupt- und Popup-Fenster. Setzen Sie same-origin-allow-popups auf Login-Seiten, die OAuth-Flows nutzen.

Islands laden externe APIs

React/Vue-Islands, die externe APIs per fetch() laden, sind von CORP/COEP nicht betroffen -- nur eingebettete Ressourcen (Bilder, Iframes, Scripts) werden blockiert. fetch() wird durch CORS gesteuert, nicht durch COEP.

prerender-Seiten ohne Header

Prerenderte Seiten erhalten keine Middleware-Header. Setzen Sie Cross-Origin Headers auf dem Webserver, um auch statische Seiten im Hybrid-Modus abzudecken.

Compliance-Relevanz

Cross-Origin Headers schützen gegen Spectre-Seitenkanalangriffe und sind Teil der NIS2-Anforderungen an technische Cybersicherheitsmassnahmen. Die Prozess-Isolation verhindert, dass ein kompromittiertes Drittanbieter-Script auf sensible Daten anderer Origins zugreifen kann. Der Wolf-Agents Web Security Check bewertet COOP, CORP und COEP mit bis zu 30 Punkten -- der zweithöchste Wert nach CSP.

Wie steht Ihre Domain bei Cross-Origin Headers?

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