HTTP-Cross-Origin-Resource-Policy-Header

Typ

Der Cross-Origin-Resource-Policy-Header ist ein HTTP-Response-Header, mit dem der Server steuert, welche Origins eine Ressource in Cross-Origin-Kontexten laden dürfen.

Syntax

Der Header definiert die Policy für Cross-Origin-Zugriffe auf die Ressource.

http
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Resource-Policy: same-site
Cross-Origin-Resource-Policy: cross-origin

Direktiven

Der Cross-Origin-Resource-Policy-Header verwendet folgende Direktiven:

same-origin
Erlaubt das Laden der Ressource nur von der gleichen Origin. Verhindert Cross-Origin und Cross-Site-Zugriffe vollständig.
same-site
Erlaubt das Laden der Ressource von der gleichen Site (gleiche registrierbare Domain). Verhindert Cross-Site-Zugriffe, erlaubt aber Subdomains.
cross-origin
Erlaubt das Laden der Ressource von jeder Origin. Opt-in für Cross-Origin-Einbettung in COEP-Kontexten.

Beispiele

API-Ressource nur für Same-Origin

Eine API schützt sensitive Daten vor Cross-Origin-Zugriff:

http
GET /api/v1/user/profile HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Der Server erlaubt nur Same-Origin-Zugriffe:

http
HTTP/1.1 200 OK
Cross-Origin-Resource-Policy: same-origin
Content-Type: application/json

{
  "user_id": "12345",
  "email": "max@example.com",
  "ssn": "123-45-6789"
}

Ein Cross-Origin-Fetch wird blockiert:

http
// Von https://external.com ausgeführt
fetch('https://api.example.com/api/v1/user/profile')
  .catch(err => console.error('CORP blocked:', err));
// Fehler: Cross-Origin-Resource-Policy blockiert

CDN-Ressource für Same-Site-Zugriff

Eine CDN-gehostete API-Ressource erlaubt Same-Site-Zugriffe:

http
GET /assets/data/config.json HTTP/1.1
Host: cdn.example.com

Der CDN-Server erlaubt Same-Site, aber nicht Cross-Site:

http
HTTP/1.1 200 OK
Cross-Origin-Resource-Policy: same-site
Content-Type: application/json

{
  "api_endpoint": "https://api.example.com",
  "features": ["auth", "analytics"]
}

Public API mit Cross-Origin-Zugriff

Eine öffentliche API erlaubt Cross-Origin-Einbettung:

http
GET /api/v1/public/rates HTTP/1.1
Host: api.example.com

Der Server erlaubt Cross-Origin-Zugriff explizit:

http
HTTP/1.1 200 OK
Cross-Origin-Resource-Policy: cross-origin
Access-Control-Allow-Origin: *
Content-Type: application/json

{
  "currency": "USD",
  "rates": {
    "EUR": 0.85,
    "GBP": 0.73
  }
}

CORP-with-COEP-Flow

Der Ablauf der Ressourcen-Isolation mit CORP in Cross-Origin-Embedder-Policy-Kontexten.

plantuml
@startuml
actor Browser
participant "Main App\n(app.example.com)" as App
participant "External API\n(api.external.com)" as API

Browser -> App: GET /app
App --> Browser: 200 OK\nCross-Origin-Embedder-Policy: require-corp

Browser -> Browser: Activate COEP\nRequire CORP for cross-origin

Browser -> API: fetch('/data.json')\nOrigin: https://app.example.com

alt API has CORP: cross-origin
  API --> Browser: 200 OK\nCross-Origin-Resource-Policy: cross-origin\n[data]
  Browser -> Browser: CORP check passed\nAllow resource load
  Browser -> App: Return data
else API has CORP: same-origin
  API --> Browser: 200 OK\nCross-Origin-Resource-Policy: same-origin\n[data]
  Browser -> Browser: CORP check failed\nOrigin mismatch
  Browser -x App: Block resource\nCOEP violation
else API missing CORP
  API --> Browser: 200 OK\n[data without CORP]
  Browser -> Browser: Missing CORP\nin COEP context
  Browser -x App: Block resource\nCOEP requires CORP
end
@enduml

Vorteile für die Systemarchitektur

  • Schützt sensitive API-Ressourcen vor unautorisierten Cross-Origin-Zugriffen
  • Verhindert Spectre-Angriffe durch Kontrolle über Cross-Origin-Einbettung
  • Ermöglicht granulare Kontrolle mit same-origin, same-site und cross-origin Policies
  • Erforderlich für Cross-Origin-Embedder-Policy-Kontexte mit require-corp
  • Ergänzt CORS durch zusätzliche Schutzschicht auf Ressourcen-Ebene

Spezifikation

Der Cross-Origin-Resource-Policy-Header ist im Fetch Standard definiert.

Weitere Spezifikationen

Cross-Origin-Embedder-Policy Header, Cross-Origin-Opener-Policy Header