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:
- CORS ist ein Browser-Mechanismus – Server-zu-Server-Kommunikation (Node.js, Python, curl) kennt kein CORS
- 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 A | URL B | Gleiche Origin? |
|---|---|---|
https://example.com | https://example.com/api | ✅ Ja |
https://example.com | http://example.com | ❌ Nein (Schema) |
https://example.com | https://api.example.com | ❌ Nein (Subdomain) |
https://example.com | https://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
| Fehler | Ursache | Lösung |
|---|---|---|
* + credentials: true | Nicht erlaubt | Spezifische Origin angeben |
| Preflight 404 | OPTIONS-Route fehlt | CORS-Middleware vor Routen |
| Subdomain nicht erlaubt | api.example.com ≠ example.com | Subdomain explizit hinzufügen |
| Localhost in Production | Vergessen zu entfernen | Env-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.
Anfrageweg verstehen
01
Bestimme Frontend-Origin, API-Origin, verwendete Methoden, Header und ob browserbasierte Credentials überhaupt nötig sind.
Origin → API → Methode → Header → CredentialsErlaubnisse minimal definieren
02
Lege konkrete Origins, Methoden und Header fest statt breiter Freigaben, die den tatsächlichen Bedarf überschreiten.
allow origin + methods + headers = minimaler BedarfPreflight vollständig behandeln
03
Der Server beantwortet OPTIONS-Anfragen konsistent, damit der Browser die eigentliche Anfrage nur bei erlaubter Kombination sendet.
OPTIONS → erlaubte Regeln → BrowserentscheidungUmgebungen getrennt konfigurieren
04
Lokale Entwicklung und Produktion brauchen unterschiedliche, explizit gepflegte Origins und dürfen nicht verwechselt werden.
dev allowlist ≠ production allowlistMit 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 FortgeschritteneDer CORS-Entscheidungsweg im Browser
Browser, Serverregeln und die konkrete Anfrage bilden zusammen die Entscheidung über eine Cross-Origin-Antwort.
Eine Browseranfrage zwischen unterschiedlichem Schema, Host oder Port.