Zum Inhalt springen
≈ 2 minNeuWebHTTPSecurity

CORS

Cross-Origin Resource Sharing ist der Mechanismus, mit dem ein Server dem Browser erlaubt, dass JavaScript einer fremden Origin seine Antworten lesen darf.

In 30 Sekunden

  1. 01

    Browser blockieren standardmäßig, dass JavaScript Antworten von einer anderen Origin liest (Same-Origin Policy).

  2. 02

    Mit CORS-Headern wie Access-Control-Allow-Origin gibt der Server gezielt Origins frei.

  3. 03

    Bei „nicht-einfachen“ Anfragen fragt der Browser vorher per OPTIONS-Preflight um Erlaubnis.

Das Problem: die Same-Origin Policy

Eine Origin besteht aus Schema + Host + Port. Lädt eine Seite von https://app.example.com Daten per fetch() von https://api.example.com, ist das eine Cross-Origin-Anfrage. Ohne Freigabe darf das JavaScript die Antwort nicht lesen – sonst könnte jede Website im Hintergrund mit deinen Cookies dein Webmail oder Online-Banking auslesen.

fetch()Origin: app…app.example.comJavaScript im BrowserBrowserprüft CORS-Headerapi.example.comandere Origin
Der Browser sitzt dazwischen: Er sendet die Origin mit und gibt die Antwort nur frei, wenn der Server sie erlaubt.

Zwei Abläufe

Einfache Anfrage

GET, HEAD oder POST mit Standard-Headern gehen direkt raus. Der Browser prüft erst die Antwort.

Browser
API-Server
  1. 01GET /orders

    Origin: https://app.example.com

  2. Server verarbeitet die Anfrage
  3. 02200 OK

    Access-Control-Allow-Origin: https://app.example.com

  4. Header passt → JavaScript darf lesen

Fehlt der Header, kommt die Antwort trotzdem an – JavaScript sieht nur einen Fehler.

Mit Preflight

Bei PUT/DELETE, eigenen Headern wie Authorization oder Content-Type: application/json fragt der Browser vorher per Preflight nach.

Browser
API-Server
  1. 01OPTIONS /orders

    Access-Control-Request-Method: PUT

  2. 02204 No Content

    Allow-Methods: PUT · Allow-Headers: Authorization

  3. Erlaubt → jetzt die echte Anfrage
  4. 03PUT /orders/42

    Authorization: Bearer …

  5. 04200 OK

    Access-Control-Allow-Origin: https://app.example.com

Schlägt der Preflight fehl, wird die eigentliche Anfrage gar nicht erst gesendet.

Die wichtigsten Header

Origin

RichtungBrowser → Server

BedeutungVon welcher Origin die Anfrage stammt

Access-Control-Allow-Origin

RichtungServer → Browser

BedeutungErlaubte Origin (oder * für alle, aber nicht mit Cookies)

Access-Control-Allow-Methods

RichtungServer → Browser

BedeutungErlaubte HTTP-Methoden (Preflight)

Access-Control-Allow-Headers

RichtungServer → Browser

BedeutungErlaubte eigene Header (Preflight)

Access-Control-Allow-Credentials

RichtungServer → Browser

Bedeutungtrue = Cookies/Auth dürfen mitgeschickt werden

Access-Control-Max-Age

RichtungServer → Browser

BedeutungWie lange der Preflight gecacht werden darf

KriteriumRichtungBedeutung
OriginBrowser → ServerVon welcher Origin die Anfrage stammt
Access-Control-Allow-OriginServer → BrowserErlaubte Origin (oder * für alle, aber nicht mit Cookies)
Access-Control-Allow-MethodsServer → BrowserErlaubte HTTP-Methoden (Preflight)
Access-Control-Allow-HeadersServer → BrowserErlaubte eigene Header (Preflight)
Access-Control-Allow-CredentialsServer → Browsertrue = Cookies/Auth dürfen mitgeschickt werden
Access-Control-Max-AgeServer → BrowserWie lange der Preflight gecacht werden darf

Typische Fehler

Wildcard mit Cookies

Allow-Origin: * und credentials: 'include' schließen sich aus. Die konkrete Origin zurückgeben.

Preflight läuft in die Auth

Die OPTIONS-Anfrage trägt kein Token. Middleware, die sie mit 401 abweist, bricht CORS.

Header doppelt oder verschluckt

Proxy und App setzen beide CORS-Header – oder der Proxy entfernt sie. CORS an genau einer Stelle konfigurieren.

Caching ohne Vary

Wird die Origin dynamisch zurückgegeben, gehört Vary: Origin dazu, sonst liefert ein Cache die falsche Freigabe.

Merksatz

„CORS schützt die Nutzer im Browser, nicht deinen Server – Authentifizierung brauchst du trotzdem.“

Selbsttest

Erst selbst überlegen, dann aufklappen.

01Sind https://app.example.com und https://api.example.com dieselbe Origin?

Nein. Die Origin besteht aus Schema, Host und Port – die Hosts unterscheiden sich, also ist es Cross-Origin.

02Ein CORS-Fehler erscheint in der Konsole. Hat der Server die Anfrage trotzdem bekommen?

Bei einfachen Anfragen ja – der Browser blockiert nur das Lesen der Antwort. Nur ein fehlgeschlagener Preflight verhindert, dass die eigentliche Anfrage gesendet wird.

03Warum funktioniert dieselbe Anfrage mit curl oder Postman, aber nicht im Browser?

CORS wird ausschließlich vom Browser durchgesetzt. Andere Clients ignorieren die Header.

Weiter in Web

API Gateway vs. Load Balancer vs. Reverse Proxy