CORS

Wie Browser und Server Cross-Origin-Zugriffe gezielt abstimmen, ohne aus einem lokalen Entwicklungsproblem eine offene Produktionsfreigabe zu machen.

Ein Browser-Sicherheitsmechanismus, der kontrolliert, welche Webseiten Anfragen an eine andere Domain stellen dürfen – und wie Server diese Anfragen erlauben oder ablehnen.

Fortgeschritten2 Min Lesezeit

Erklärung starten

Auf einen Blick

3 Punkte

  1. Browsers blockieren standardmäßig Anfragen an andere Domains (Same-Origin-Policy)
  2. Server können mit CORS-Headers bestimmte Domains explizit erlauben
  3. Preflight-Anfragen (OPTIONS) prüfen vorab, ob eine Anfrage erlaubt ist

Sofortantwort

CORS einfach erklärt

Browser-Sicherheitsmechanismus, der regelt, welche Domains API-Anfragen stellen dürfen.

Kurz gesagt
Browsers blockieren standardmäßig Anfragen an andere Domains (Same-Origin-Policy)
Typischer Einsatz
Frontend-Backend-Trennung, KI-API-Integration, CDN-Assets
Wichtig zu wissen
Preflight-Anfragen (OPTIONS) prüfen vorab, ob eine Anfrage erlaubt ist

CORS im Überblick

Browser haben eine eingebaute Sicherheitsregel: Eine Webseite darf standardmäßig nur Anfragen an dieselbe Domain stellen, von der sie geladen wurde (Same-Origin-Policy). frontend.example.com darf also nicht einfach api.other.com aufrufen.

CORS ist der Mechanismus, mit dem Server diese Einschränkung gezielt aufheben können. Der Server sagt dem Browser: „Anfragen von frontend.example.com sind erlaubt.” Der Browser prüft das und lässt die Anfrage durch.

Zwei wichtige Grundregeln:

  1. CORS ist ein Browser-Mechanismus – Server-zu-Server-Kommunikation (Node.js, Python, curl) kennt kein CORS
  2. Die Lösung liegt immer auf dem Server – der Browser blockiert nur, weil der Server keine CORS-Header schickt

Was ist eine “Origin”?

Eine Origin besteht aus Schema + Domain + Port. Alle drei müssen übereinstimmen:

URL AURL BGleiche Origin?
https://example.comhttps://example.com/api✅ Ja
https://example.comhttp://example.com❌ Nein (Schema)
https://example.comhttps://api.example.com❌ Nein (Subdomain)
https://example.comhttps://example.com:3000❌ Nein (Port)

Technisch betrachtet

Die wichtigsten CORS-Headers

# Server-Antwort
Access-Control-Allow-Origin: https://frontend.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400  # Preflight 24h cachen
Access-Control-Allow-Credentials: true  # Nur wenn Cookies nötig

CORS in Express.js konfigurieren

import cors from 'cors';

// Dynamische Origin-Validierung (sicherer als Whitelist)
const allowedOrigins = [
  'https://frontend.example.com',
  'https://app.example.com',
  process.env.NODE_ENV === 'development' ? 'http://localhost:3000' : null,
].filter(Boolean);

app.use(cors({
  origin: (origin, callback) => {
    if (!origin || allowedOrigins.includes(origin)) {
      callback(null, true);
    } else {
      callback(new Error(`CORS: Origin ${origin} nicht erlaubt`));
    }
  },
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  credentials: true,
}));

CORS in FastAPI (Python)

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://frontend.example.com"],
    allow_credentials=True,
    allow_methods=["GET", "POST", "PUT", "DELETE"],
    allow_headers=["Content-Type", "Authorization"],
    max_age=86400,
)

Preflight-Flow

Browser → OPTIONS /api/data (Preflight)
          Headers: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
Server  → 200 OK
          Headers: Access-Control-Allow-Origin, Access-Control-Allow-Methods, ...
Browser → POST /api/data (eigentliche Anfrage)
Server  → 200 OK + Daten

Preflight wird ausgelöst bei: nicht-standard Methoden (PUT, DELETE), custom Headers (Authorization), Content-Type außer text/plain, multipart/form-data, application/x-www-form-urlencoded.

Sicherheitsrisiken bei falschem CORS

// ❌ Gefährlich: Jede Origin erlaubt
app.use(cors({ origin: '*' }));

// ❌ Noch gefährlicher: Origin aus Request übernehmen
app.use((req, res) => {
  res.header('Access-Control-Allow-Origin', req.headers.origin); // Nie so!
});

// ❌ Wildcard + Credentials funktioniert nicht (Browser blockiert)
app.use(cors({ origin: '*', credentials: true }));

// ✅ Korrekt: Explizite Whitelist
app.use(cors({ origin: ['https://app.example.com'] }));

Debugging-Workflow

1. Browser-Konsole: Welcher Header fehlt?
   "No 'Access-Control-Allow-Origin' header" → Origin nicht erlaubt
   "Response to preflight has invalid HTTP status code 404" → OPTIONS-Route fehlt

2. curl testen (kein CORS):
   curl -H "Origin: https://frontend.example.com" \
        -H "Access-Control-Request-Method: POST" \
        -X OPTIONS https://api.example.com/data -v

3. Response-Headers prüfen:
   Access-Control-Allow-Origin: https://frontend.example.com ✅
   Access-Control-Allow-Methods: GET, POST ✅

Häufige Fehler

FehlerUrsacheLösung
* + credentials: trueNicht erlaubtSpezifische Origin angeben
Preflight 404OPTIONS-Route fehltCORS-Middleware vor Routen
Subdomain nicht erlaubtapi.example.comexample.comSubdomain explizit hinzufügen
Localhost in ProductionVergessen zu entfernenEnv-Variable für Origins nutzen

Schritt für Schritt

CORS gezielt und sicher konfigurieren

CORS ist eine Browserregel. Eine gute Konfiguration erlaubt nur die tatsächlich benötigten Ursprünge, Methoden und Header – getrennt nach Umgebung und ohne Geheimnisse im Frontend.

  1. Anfrageweg verstehen

    01

    Bestimme Frontend-Origin, API-Origin, verwendete Methoden, Header und ob browserbasierte Credentials überhaupt nötig sind.

    Origin → API → Methode → Header → Credentials
  2. Erlaubnisse minimal definieren

    02

    Lege konkrete Origins, Methoden und Header fest statt breiter Freigaben, die den tatsächlichen Bedarf überschreiten.

    allow origin + methods + headers = minimaler Bedarf
  3. Preflight vollständig behandeln

    03

    Der Server beantwortet OPTIONS-Anfragen konsistent, damit der Browser die eigentliche Anfrage nur bei erlaubter Kombination sendet.

    OPTIONS → erlaubte Regeln → Browserentscheidung
  4. Umgebungen getrennt konfigurieren

    04

    Lokale Entwicklung und Produktion brauchen unterschiedliche, explizit gepflegte Origins und dürfen nicht verwechselt werden.

    dev allowlist ≠ production allowlist
  5. Mit echten Browserfällen testen

    05

    Teste erfolgreiche und erwartbar abgelehnte Anfragen; beobachte Fehler, ohne sensible Daten oder Zugangstokens preiszugeben.

    Browser-Test → erwartete Antwort / Blockierung → Monitoring

Konkretes Beispiel

Beispiel: Web-App und separate API

Eine Produktoberfläche läuft auf einer anderen Domain als die API und benötigt eine Anmeldung über sichere Cookies.

CORS-Frage

Welche konkrete Origin darf welche Anfragen mit Credentials stellen, und wie wird eine Anfrage von einer unbekannten Website behandelt?

Explizite Freigabe

Eine enge Allowlist, passende Methoden und Header, korrektes Credential-Verhalten sowie Tests für erlaubte und abgelehnte Browseranfragen.

CORS ergänzt Authentifizierung nicht und ersetzt sie nicht: Es steuert, welche Webseiten der Browser als berechtigte Aufrufer akzeptiert.

Einordnung

Vorteile und Grenzen

Das spricht dafür

  • Browser-Schutz: Server können Cross-Origin-Zugriffe gezielt statt pauschal erlauben.
  • Klare Integration: Frontend und API erhalten einen nachvollziehbaren Vertrag über erlaubte Browseranfragen.
  • Bessere Diagnose: Eine dokumentierte Konfiguration trennt CORS-Probleme von Authentifizierungs- oder Netzwerkfehlern.

Das solltest du beachten

  • Konfigurationsaufwand: Origins, Header, Methoden und Preflight-Verhalten müssen zusammenpassen.
  • Kein API-Schutz allein: Nicht-Browser-Clients sind nicht durch CORS eingeschränkt und brauchen eigene Autorisierung.
  • Fehlfreigaben riskant: Zu breite Regeln oder unklare Credential-Konfigurationen können unnötige Angriffsflächen schaffen.
Vertiefung · für Fortgeschrittene

Der CORS-Entscheidungsweg im Browser

Browser, Serverregeln und die konkrete Anfrage bilden zusammen die Entscheidung über eine Cross-Origin-Antwort.

Wissenskarte

Eine Browseranfrage zwischen unterschiedlichem Schema, Host oder Port.

Eine minimalistische, getestete CORS-Konfiguration erlaubt notwendige Integrationen und begrenzt unnötige Browserfreigaben. Cross-Origin Request gliedert sich in: Frontend-Origin, Preflight, Server-Allowlist, Methoden, Header, Credentials.

01Einsatzbereiche

Wann ist CORS sinnvoll?

Geeignet für

  • Frontend-Backend-TrennungReact-App auf frontend.example.com ruft API auf api.example.com auf – CORS muss konfiguriert sein
  • KI-API-IntegrationBrowser-basierte KI-Tools, die direkt OpenAI oder andere APIs aufrufen
  • CDN-AssetsFonts, Bilder oder Skripte von einer anderen Domain laden

↑ Inhalt

02Werkzeuge

Womit CORS umgesetzt wird

↑ Inhalt

Merksatz

CORS ist wie ein Türsteher an einem Clubeingang

Dein Browser fragt: 'Darf frontend.example.com rein?' Der Server (Club) antwortet: 'Ja, aber nur mit Gästeliste-Eintrag' oder 'Nein, nicht auf der Liste.' Der Türsteher (Browser) lässt dich nur rein, wenn der Club es ausdrücklich erlaubt.

  1. Browsers blockieren standardmäßig Anfragen an andere Domains (Same-Origin-Policy)
  2. Server können mit CORS-Headers bestimmte Domains explizit erlauben
  3. Preflight-Anfragen (OPTIONS) prüfen vorab, ob eine Anfrage erlaubt ist

04Redaktion

Herkunft und Stand

Redaktion und Aktualität

Ebenex RedaktionRedaktion

Veröffentlicht
Aktualisiert

Dieses Feld entwickelt sich schnell. Oben stehen Veröffentlichung und letzte Änderung; ein Prüfdatum kommt dazu, sobald die Erklärung nach ihrer letzten Änderung geprüft wurde.

↑ Inhalt

05FAQ

Häufige Fragen zu CORS

Warum bekomme ich einen CORS-Fehler, obwohl mein Server antwortet?

CORS wird vom Browser erzwungen, nicht vom Server. Der Server antwortet – aber der Browser blockiert die Antwort, weil der Server keine CORS-Header gesetzt hat. Die Lösung liegt immer auf der Server-Seite: die richtigen Access-Control-Headers setzen.

Was ist eine Preflight-Anfrage?

Vor bestimmten Anfragen (z. B. mit custom Headers oder nicht-standard Methoden) sendet der Browser automatisch eine OPTIONS-Anfrage. Der Server muss darauf mit den erlaubten Methoden und Headers antworten. Erst dann sendet der Browser die eigentliche Anfrage.

Ist CORS ein Sicherheitsproblem?

CORS ist ein Sicherheitsmechanismus, kein Problem. Falsch konfiguriertes CORS (z. B. Access-Control-Allow-Origin: *) kann aber ein Sicherheitsproblem sein, da es jeder Website erlaubt, Anfragen zu stellen.

↑ Inhalt

06Weiterlernen

Was möchtest du als Nächstes verstehen?

↑ Inhalt