JSON Web Token Sicherheit: HÀufige Schwachstellen und Lösungen
JWTs sind der De-facto-Standard fĂŒr API-Authentifizierung, aber ihre scheinbare Einfachheit verbirgt echte Sicherheitsfallen. Fehlkonfigurierte JWTs haben zu Authentifizierungsumgehungen, Rechteeskalation und Datenlecks gefĂŒhrt. Dieser Leitfaden behandelt die kritischsten Schwachstellen und wie man sie verhindert.
JWT-Struktur im Ăberblick
Ein JWT besteht aus drei Base64URL-kodierten Teilen, getrennt durch Punkte:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMiLCJyb2xlIjoiYWRtaW4ifQ.signature
- Header: Algorithmus und Token-Typ
- Payload: Claims (Benutzerdaten, Ablaufzeit usw.)
- Signatur: Kryptografische Verifizierung
ĂberprĂŒfen Sie die JWT-Struktur mit unserem JWT Encoder/Decoder.
FĂŒr ein grundlegendes VerstĂ€ndnis der JWT-Struktur siehe unseren Leitfaden JWT Tokens erklĂ€rt.
Kritische Schwachstellen
1. Algorithmenverwechslungsangriff
Die gefÀhrlichste JWT-Schwachstelle. Wenn ein Server den alg-Header aus dem Token ohne Validierung akzeptiert, kann ein Angreifer:
Angriff: Den Algorithmus von RS256 (asymmetrisch) auf HS256 (symmetrisch) Ă€ndern und das gefĂ€lschte Token mit dem öffentlichen SchlĂŒssel des Servers signieren:
// GefÀlschtes Token des Angreifers
header: { "alg": "HS256", "typ": "JWT" }
payload: { "sub": "admin", "role": "superadmin" }
// Signiert mit dem ĂFFENTLICHEN SchlĂŒssel des Servers als HMAC-Secret
Wenn der Server HS256-Tokens mit dem öffentlichen SchlĂŒssel als Secret verifiziert, besteht das gefĂ€lschte Token die Verifizierung.
Lösung: Den erwarteten Algorithmus immer explizit angeben:
// FALSCH - akzeptiert jeden Algorithmus, den das Token angibt
jwt.verify(token, key);
// RICHTIG - bestimmten Algorithmus erzwingen
jwt.verify(token, key, { algorithms: ['RS256'] });
2. None-Algorithmus-Angriff
Einige Bibliotheken akzeptieren "alg": "none" â ein Token ohne Signatur:
// GefÀlschtes Token ohne Signatur
header: { "alg": "none", "typ": "JWT" }
payload: { "sub": "admin", "role": "superadmin" }
signature: "" // leer
Lösung: Den none-Algorithmus in Produktion niemals erlauben. Erlaubte Algorithmen explizit auf eine Whitelist setzen.
3. Schwache Signiergeheimnisse
HMAC-basierte JWTs (HS256/HS384/HS512) sind nur so stark wie das Secret:
// SCHRECKLICH - kann in Sekunden per Brute-Force geknackt werden
secret = "password123"
// SCHWACH - anfĂ€llig fĂŒr Wörterbuchangriffe
secret = "my-jwt-secret"
// STARK - 256+ Bit ZufÀlligkeit
secret = "a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0"
Lösung: Mindestens 256 Bit kryptografischer ZufĂ€lligkeit fĂŒr HMAC-Secrets verwenden. Besser noch: Asymmetrische SchlĂŒssel verwenden (RS256, ES256), bei denen der SignierschlĂŒssel nie geteilt werden muss.
4. Fehlende Ablaufzeit
Tokens ohne Ablaufzeit laufen nie ab â ein gestohlenes Token gewĂ€hrt dauerhaften Zugang:
// FALSCH - keine Ablaufzeit
{ "sub": "user123", "role": "admin" }
// RICHTIG - kurze Ablaufzeit
{
"sub": "user123",
"role": "admin",
"exp": 1705312800,
"iat": 1705309200,
"nbf": 1705309200
}
Best Practice: Access-Tokens laufen in 15-60 Minuten ab. Verwenden Sie Refresh-Tokens (sicher gespeichert) fĂŒr lange Sitzungen.
5. Sensible Daten im Payload
JWT-Payloads sind Base64URL-kodiert, nicht verschlĂŒsselt. Jeder kann sie dekodieren:
echo "eyJzdWIiOiIxMjMiLCJyb2xlIjoiYWRtaW4ifQ" | base64 -d
# {"sub":"123","role":"admin"}
Niemals einschlieĂen: Passwörter, API-SchlĂŒssel, Kreditkartennummern, persönliche Daten (Sozialversicherungsnummern, Krankenakten) oder irgendein Geheimnis in JWT-Payloads.
6. Token-Speicherung (XSS vs CSRF)
| Speicherung | XSS-anfÀllig | CSRF-anfÀllig |
|---|---|---|
| localStorage | Ja | Nein |
| Cookie (ohne Flags) | Ja | Ja |
| HttpOnly Cookie | Nein | Ja |
| HttpOnly + SameSite Cookie | Nein | Nein |
Empfohlen: JWTs in HttpOnly, Secure, SameSite=Strict Cookies speichern. Dies verhindert JavaScript-Zugriff (XSS-Schutz) und Cross-Site-Anfragen (CSRF-Schutz).
Set-Cookie: token=eyJ...; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=3600
Sicherheits-Checkliste
- Algorithmen explizit angeben â niemals aus dem Token-Header akzeptieren
none-Algorithmus ablehnen â immer eine Signatur verlangen- Starke Secrets verwenden â 256+ Bit fĂŒr HMAC, 2048+ Bit fĂŒr RSA
- Kurze Ablaufzeit setzen â 15-60 Minuten fĂŒr Access-Tokens
- Alle Claims validieren â
exp,iss,aud,nbf - In HttpOnly-Cookies speichern â nicht in localStorage
- Secrets regelmĂ€Ăig rotieren â SchlĂŒsselrotation einplanen
- Niemals sensible Daten im Payload speichern
- Asymmetrische SchlĂŒssel verwenden fĂŒr verteilte Systeme (RS256 oder ES256)
- Token-Widerruf implementieren â Blacklist oder kurze Ablaufzeit + Refresh-Tokens
Asymmetrische vs. symmetrische Signierung
| Aspekt | HS256 (Symmetrisch) | RS256 (Asymmetrisch) |
|---|---|---|
| SchlĂŒssel | Geteiltes Secret | Privat-/Ăffentliches SchlĂŒsselpaar |
| Wer kann signieren | Jeder mit dem Secret | Nur der Inhaber des privaten SchlĂŒssels |
| Wer kann verifizieren | Jeder mit dem Secret | Jeder mit dem öffentlichen SchlĂŒssel |
| SchlĂŒsselverteilung | Secret muss sicher geteilt werden | Nur der öffentliche SchlĂŒssel wird geteilt |
| Leistung | Schneller | Langsamer |
| Ideal fĂŒr | Einzelner Dienst | Microservices, verteilte Systeme |
Empfehlung: Verwenden Sie ES256 (ECDSA) fĂŒr neue Anwendungen â es bietet asymmetrische Sicherheit mit einer Leistung nahe an HMAC.
Token-Widerrufsstrategien
JWTs sind konzeptionell zustandslos â es gibt keine eingebaute Möglichkeit, sie zu widerrufen. Strategien:
- Kurze Ablaufzeit: Wenn Tokens in 15 Minuten ablaufen, ist das Zeitfenster eines gestohlenen Tokens begrenzt
- Refresh-Token-Rotation: Bei jeder Verwendung ein neues Refresh-Token ausgeben; wenn ein Refresh-Token zweimal verwendet wird, alle Tokens widerrufen
- Blacklist: Widerrufene Token-IDs (jti-Claims) speichern und bei jeder Anfrage prĂŒfen
- Token-Versionierung: Eine Versionsnummer in die Claims aufnehmen; die Version des Benutzers beim Abmelden erhöhen
FAQ
Sollte ich JWT oder Session-Cookies fĂŒr die Authentifizierung verwenden?
Session-Cookies sind einfacher und sicherer fĂŒr traditionelle Webanwendungen â der Server kontrolliert den Sitzungslebenszyklus, und der Widerruf ist sofort. JWTs sind besser fĂŒr zustandslose APIs, Microservices und mobile Apps, bei denen serverseitige Sitzungsspeicherung unpraktisch ist. Wenn Sie sich fĂŒr JWTs entscheiden, implementieren Sie die SicherheitsmaĂnahmen in diesem Leitfaden.
Was ist die ideale JWT-Ablaufzeit?
FĂŒr Access-Tokens: 15-60 Minuten. KĂŒrzer ist sicherer, erfordert aber hĂ€ufigere Aktualisierung. FĂŒr Refresh-Tokens: 1-30 Tage, gespeichert in HttpOnly-Cookies. FĂŒr Einmalverwendungs-Tokens (E-Mail-Verifizierung, Passwort-ZurĂŒcksetzung): 1-24 Stunden.
Verwandte Ressourcen
- JWT Encoder/Decoder â JWTs sicher inspizieren und dekodieren
- JWT Tokens erklĂ€rt â JWT-Struktur und -Ablauf verstehen
- Passwort-Entropie erklĂ€rt â StĂ€rke von JWT-Signiergeheimnissen