alltools.one
Security‱
2025-06-12
‱
8 min
‱
alltools.one Team
JWTSecurityAuthenticationAPIWeb Security

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)

SpeicherungXSS-anfÀlligCSRF-anfÀllig
localStorageJaNein
Cookie (ohne Flags)JaJa
HttpOnly CookieNeinJa
HttpOnly + SameSite CookieNeinNein

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

  1. Algorithmen explizit angeben — niemals aus dem Token-Header akzeptieren
  2. none-Algorithmus ablehnen — immer eine Signatur verlangen
  3. Starke Secrets verwenden — 256+ Bit fĂŒr HMAC, 2048+ Bit fĂŒr RSA
  4. Kurze Ablaufzeit setzen — 15-60 Minuten fĂŒr Access-Tokens
  5. Alle Claims validieren — exp, iss, aud, nbf
  6. In HttpOnly-Cookies speichern — nicht in localStorage
  7. Secrets regelmĂ€ĂŸig rotieren — SchlĂŒsselrotation einplanen
  8. Niemals sensible Daten im Payload speichern
  9. Asymmetrische SchlĂŒssel verwenden fĂŒr verteilte Systeme (RS256 oder ES256)
  10. Token-Widerruf implementieren — Blacklist oder kurze Ablaufzeit + Refresh-Tokens

Asymmetrische vs. symmetrische Signierung

AspektHS256 (Symmetrisch)RS256 (Asymmetrisch)
SchlĂŒsselGeteiltes SecretPrivat-/Öffentliches SchlĂŒsselpaar
Wer kann signierenJeder mit dem SecretNur der Inhaber des privaten SchlĂŒssels
Wer kann verifizierenJeder mit dem SecretJeder mit dem öffentlichen SchlĂŒssel
SchlĂŒsselverteilungSecret muss sicher geteilt werdenNur der öffentliche SchlĂŒssel wird geteilt
LeistungSchnellerLangsamer
Ideal fĂŒrEinzelner DienstMicroservices, 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:

  1. Kurze Ablaufzeit: Wenn Tokens in 15 Minuten ablaufen, ist das Zeitfenster eines gestohlenen Tokens begrenzt
  2. Refresh-Token-Rotation: Bei jeder Verwendung ein neues Refresh-Token ausgeben; wenn ein Refresh-Token zweimal verwendet wird, alle Tokens widerrufen
  3. Blacklist: Widerrufene Token-IDs (jti-Claims) speichern und bei jeder Anfrage prĂŒfen
  4. 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

Published on 2025-06-12
JSON Web Token Security: Common Vulnerabilities and Fixes | alltools.one