RFC 7235 - HTTP/1.1: Authentifizierung (Authentication)
- Status: Proposed Standard
- Veröffentlicht: June 2014
- Stream: IETF
- Ersetzt: RFC2616, RFC2617
- Ersetzt durch: RFC9110
- Errata: Keine Errata
Dokumentinformationen
- RFC-Nummer: 7235
- Titel: Hypertext Transfer Protocol (HTTP/1.1): Authentication
- Titel (Deutsch): Hypertext Transfer Protocol (HTTP/1.1): Authentifizierung
- Veröffentlichungsdatum: Juni 2014
- Autoren: R. Fielding (Adobe), J. Reschke (greenbytes)
- Ersetzt Dokument: RFC 2616, RFC 2617 (teilweise)
- Status: Standards Track
Zusammenfassung
HTTP bietet ein einfaches Challenge-Response-Authentifizierungsframework, bei dem Server Client-Anfragen herausfordern können und Clients Authentifizierungsinformationen bereitstellen können. Dieses Dokument definiert den allgemeinen Mechanismus des HTTP-Authentifizierungsframeworks, einschließlich der Statuscodes 401, 407 und verwandter Header-Felder.
Kernkonzepte
HTTP-Authentifizierungsablauf
1. Client fordert geschützte Ressource an
→ GET /admin HTTP/1.1
2. Server gibt Challenge zurück
← HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Admin Area"
3. Client liefert Anmeldedaten
→ GET /admin HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd29yZA==
4. Server verifiziert und antwortet
← HTTP/1.1 200 OK
[Geschützter Inhalt...]
Authentifizierungsschemata (Authentication Schemes)
HTTP unterstützt mehrere Authentifizierungsschemata:
- Basic: Basisauthentifizierung (RFC 7617)
- Bearer: Bearer-Token (RFC 6750)
- Digest: Digest-Authentifizierung (RFC 7616)
- OAuth: OAuth-Authentifizierung (RFC 6749)
401 Unauthorized
Zeigt an, dass die Anfrage keine gültigen Authentifizierungsinformationen enthält.
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="WallyWorld"
Content-Type: text/html
Content-Length: 0
Wichtig: Der Name "Unauthorized" von 401 bedeutet tatsächlich Unauthenticated (Nicht authentifiziert).
407 Proxy Authentication Required
Zeigt an, dass der Client sich zuerst beim Proxy authentifizieren muss.
HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic realm="Proxy Access"
WWW-Authenticate Header
Der Server verwendet diesen Header, um eine Authentifizierungs-Challenge zu definieren.
Grundlegende Syntax
WWW-Authenticate: <scheme> realm="<realm>" [, <param>=<value>]*
Beispiele
Einzelne Challenge:
WWW-Authenticate: Basic realm="Admin Area"
Mehrere Challenges (Client kann wählen):
WWW-Authenticate: Bearer realm="API", Basic realm="API"
Mit zusätzlichen Parametern:
WWW-Authenticate: Digest
realm="[email protected]",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
realm-Parameter
realm (Bereich) definiert den Umfang des geschützten Raums:
WWW-Authenticate: Basic realm="Administratorbereich"
- Wird normalerweise im Authentifizierungsdialog des Browsers angezeigt
- Hilft Benutzern zu verstehen, welche Anmeldedaten erforderlich sind
- Ressourcen mit demselben realm teilen sich Anmeldedaten
Authorization Header
Der Client verwendet diesen Header, um Authentifizierungsinformationen bereitzustellen.
Grundlegende Syntax
Authorization: <scheme> <credentials>
Beispiele
Basic-Authentifizierung:
Authorization: Basic dXNlcjpwYXNzd29yZA==
Bearer-Token:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Digest-Authentifizierung:
Authorization: Digest username="user",
realm="[email protected]",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
response="6629fae49393a05397450978507c4ef1"
Proxy-Authenticate und Proxy-Authorization
Werden für Proxy-Authentifizierung verwendet und funktionieren ähnlich wie WWW-Authenticate und Authorization.
Proxy-Authentifizierungsablauf
1. Client-Anfrage
→ GET http://example.com/ HTTP/1.1
2. Proxy fordert Authentifizierung
← HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic realm="Proxy"
3. Client liefert Anmeldedaten
→ GET http://example.com/ HTTP/1.1
Proxy-Authorization: Basic cHJveHk6cGFzc3dvcmQ=
4. Proxy leitet Anfrage weiter
[Proxy] → GET / HTTP/1.1
Host: example.com
Basic-Authentifizierung (RFC 7617)
Das einfachste, aber unsicherste Authentifizierungsschema.
Anmeldedaten kodieren
// 1. Benutzername und Passwort kombinieren
const credentials = "username:password";
// 2. Base64-Kodierung
const encoded = btoa(credentials);
// Ergebnis: "dXNlcm5hbWU6cGFzc3dvcmQ="
// 3. Authorization-Header erstellen
const auth = `Basic ${encoded}`;
Vollständiges Beispiel
GET /admin HTTP/1.1
Host: example.com
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Sicherheitswarnung
Gefahr: Basic-Authentifizierung überträgt Anmeldedaten Base64-kodiert, das ist keine Verschlüsselung!
dXNlcm5hbWU6cGFzc3dvcmQ=
↓ Base64-Dekodierung
username:password
HTTPS muss verwendet werden:
✗ http://example.com + Basic-Auth = Klartext-Übertragung
✓ https://example.com + Basic-Auth = Verschlüsselte Übertragung
Bearer-Token-Authentifizierung (RFC 6750)
Ein häufig verwendetes Authentifizierungsschema für moderne Web-APIs.
Verwendungsszenarien
Wird normalerweise mit OAuth 2.0 verwendet:
1. Benutzer meldet sich an, erhält Zugriffstoken
← { "access_token": "eyJhbG...", "token_type": "Bearer" }
2. Token verwenden, um auf API zuzugreifen
→ GET /api/user HTTP/1.1
Authorization: Bearer eyJhbG...
Beispiel
GET /api/resource HTTP/1.1
Host: api.example.com
Authorization: Bearer mF_9.B5f-4.1JqM
Fehlerantwort
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="API",
error="invalid_token",
error_description="The access token expired"
Digest-Authentifizierung (RFC 7616)
Sicherer als Basic, aber komplexer.
Merkmale
- Überträgt Passwort nicht direkt
- Verwendet Challenge-Response-Mechanismus
- Verhindert Replay-Angriffe (durch nonce)
Vereinfachter Ablauf
1. Server sendet Challenge (mit nonce)
← WWW-Authenticate: Digest realm="...", nonce="..."
2. Client berechnet Antwort
response = MD5(
MD5(username:realm:password) :
nonce :
MD5(method:uri)
)
3. Client sendet Antwort
→ Authorization: Digest username="...", response="..."
Praktische Anwendungsszenarien
Szenario 1: Webanwendungsanmeldung
Traditionelles Formular + Session (empfohlen):
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=user&password=pass
→ HTTP/1.1 302 Found
Set-Cookie: sessionid=abc123; HttpOnly; Secure
HTTP Basic-Auth nicht verwenden (es sei denn über HTTPS).
Szenario 2: API-Authentifizierung
Bearer Token (empfohlen):
GET /api/users HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Szenario 3: Verwaltungsoberfläche schützen
Basic-Auth + HTTPS (einfache Szenarien):
GET /admin HTTP/1.1
Host: secure.example.com
Authorization: Basic YWRtaW46c2VjcmV0
Szenario 4: Microservice-Authentifizierung
Mutual TLS + Bearer Token:
GET /internal/service HTTP/1.1
Host: internal.example.com
Authorization: Bearer service-token-123
Authentifizierung vs. Autorisierung
Unterschied
Authentifizierung (Authentication): "Wer bist du?"
Authorization: Bearer [Identitätstoken]
Autorisierung (Authorization): "Was darfst du tun?"
Im Token enthaltene Berechtigungen:
{
"user_id": "123",
"roles": ["admin", "editor"],
"permissions": ["read", "write", "delete"]
}
HTTP-Statuscodes
- 401 Unauthorized: Authentifizierung fehlgeschlagen oder fehlt
- 403 Forbidden: Authentifizierung erfolgreich, aber keine Berechtigung
Benutzer A versucht auf Admin-Ressource zuzugreifen:
→ Nicht angemeldet → 401 Unauthorized
→ Angemeldet (normaler Benutzer) → 403 Forbidden
→ Angemeldet (Administrator) → 200 OK
Best Practices
Serverseitig
-
Immer HTTPS verwenden
✓ https://api.example.com
✗ http://api.example.com -
Klares realm bereitstellen
WWW-Authenticate: Bearer realm="My API v1" -
Mehrere Authentifizierungsschemata unterstützen
WWW-Authenticate: Bearer realm="API", Basic realm="API" -
Fehlgeschlagene Versuche begrenzen
- Rate Limiting implementieren
- Fehlgeschlagene Authentifizierungsversuche protokollieren
- Temporäres Sperren von Konten erwägen
-
Anmeldedaten sicher speichern
- Passwörter mit starkem Hashing (bcrypt, Argon2)
- Token mit sicherem Zufallsgenerator
Clientseitig
-
Token sicher speichern
// ✓ Empfohlen
sessionStorage.setItem('token', token);
// ✗ Vermeiden (XSS-Risiko)
localStorage.setItem('token', token); -
401-Antworten behandeln
if (response.status === 401) {
// Lokales Token löschen
// Zur Anmeldeseite umleiten
} -
Token-Aktualisierung
// Token automatisch aktualisieren, bevor es abläuft
if (tokenExpiresIn < 5 * 60) {
refreshToken();
}
Sicherheitsüberlegungen
1. Man-in-the-Middle-Angriffe
Risiko: Unverschlüsselte Übertragung von Anmeldedaten
Verteidigung: HTTPS verwenden
✗ HTTP + Basic: Klartext-Anmeldedaten gestohlen
✓ HTTPS + Basic: Verschlüsselte Übertragung, sicher
2. Replay-Angriffe
Risiko: Angreifer fangen Authentifizierungsanfragen ab und spielen sie erneut ab
Verteidigung:
- Kurzlebige Token verwenden
- Nonce-Mechanismus implementieren
- Token an bestimmten Client binden
3. Anmeldedaten-Lecks
Risiko: Anmeldedaten werden protokolliert oder geleakt
Verteidigung:
- Anmeldedaten nicht in URL übergeben
- Kurzlebige Zugriffstoken verwenden
- Refresh-Token-Mechanismus implementieren
✗ https://api.example.com/data?token=abc123
✓ Authorization: Bearer abc123
4. XSS-Angriffe
Risiko: Bösartige Skripte stehlen Token
Verteidigung:
- HttpOnly-Cookies verwenden
- CSP-Richtlinien implementieren
- Eingaben validieren und bereinigen
Zusammenfassung
HTTP-Authentifizierung bietet ein flexibles Framework:
- Vertrauen: Authentifizierungsprotokolle präzise implementieren, Sicherheit gewährleisten
- Klarheit: Authentifizierungsanforderungen klar ausdrücken, Client-Implementierung erleichtern
- Eleganz: Authentifizierungsabläufe elegant gestalten, Benutzererfahrung verbessern
Kernprinzipien:
- Immer HTTPS verwenden
- Geeignetes Authentifizierungsschema für Szenario wählen
- Defense-in-Depth-Strategie implementieren
- Anmeldedaten regelmäßig rotieren
Moderne Empfehlungen:
- Webanwendungen: OAuth 2.0 + OpenID Connect
- API: Bearer Token (JWT)
- Einfache Szenarien: Basic + HTTPS
- Vermeiden: Digest (veraltet und komplex)
Verwandte Dokumente:
- RFC 7617: Basic-Authentifizierung
- RFC 7616: Digest-Authentifizierung
- RFC 6750: Bearer Token
- RFC 6749: OAuth 2.0