Was ist ein JWT-Token? Ansprüche, Signaturalgorithmen und Sicherheitsbest Practices
Rudra Chauhan, Senior Systems Architect
Was ist ein JWT-Token? Ansprüche, Signaturalgorithmen und Sicherheitsbest Practices
JSON Web Tokens (JWT) gemäß RFC 7519 sind eine offene, branchenstandardisierte Methode zur sicheren Darstellung von Ansprüchen zwischen zwei Parteien. JWTs werden weit verbreitet für stateless Authentifizierung in REST-APIs, Microservices und Single-Page-Anwendungen (SPAs) verwendet.
Allerdings kann eine fehlerhafte Implementierung der JWT-Verifizierung kritische Authentifizierungsbypass-Vulnerabilitäten einleiten.
Anatomie eines JWT-Tokens
Ein JWT-String besteht aus drei base64url-codierten Teilen, die durch Punkte (.) getrennt sind:
HEADER . PAYLOAD . SIGNATURE
Beispiel:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. Header
Enthält den Token-Typ und den Signaturalgorithmus:
json{ "alg": "HS256", "typ": "JWT" }
2. Payload (Ansprüche)
Enthält Aussagen über eine Entität (typischerweise den Benutzer) und zusätzliche Metadaten:
sub(Berechtigter): Benutzer-IDiat(Ausgestellt am): Timestampexp(Ablaufdatum): Ablaufzeitstempeliss(Aussteller): Identitätsanbieter-URL
3. Signatur
Wird durch die Verwendung der kodierten Header, der kodierten Payload, eines geheimen Schlüssels und der Signierung mit dem angegebenen Algorithmus erstellt.
JWT-Payload-Struktur
json{ "iss": "https://example.com", "sub": "1234567890", "iat": 1643723900, "exp": 1643723900, "aud": "https://example.com/api/v1", "jti": "1234567890", "name": "John Doe", "email": "john.doe@example.com", "roles": ["admin", "moderator"] }
JWT-Signatur-Generierung
bashecho -n '{"alg":"HS256","typ":"JWT"}' | base64 echo -n '{"iss":"https://example.com","sub":"1234567890","iat":1643723900,"exp":1643723900,"aud":"https://example.com/api/v1","jti":"1234567890","name":"John Doe","email":"john.doe@example.com","roles":["admin","moderator"]}' | base64 secret_key="Ihr_Schlüssel_hier" signature=$(echo -n "$(base64 -d <<< "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9")$(base64 -d <<< "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ")" | openssl dgst -sha256 -hmac "$secret_key" -binary | base64 -w 0)
2. Symmetrische (HS256) vs. Asymmetrische (RS256) Signierung
| Merkmal | HMAC SHA-256 (HS256) | RSA SHA-256 (RS256) |
|---|---|---|
| Schlüsseltyp | Geteilter geheimer Schlüssel (Symmetrisch) | Öffentlicher / Geheimer Schlüsselpaar (Asymmetrisch) |
| Signierung | Mit geheimem Schlüssel erfolgt | Mit geheimem Schlüssel erfolgt |
| Verifizierung | Mit geheimem Schlüssel erfolgt | Mit öffentlichem Schlüssel erfolgt |
| Beste Anwendung | Monolithische Backends, bei denen ein einzelner Server Ausgabe und Verifizierung durchführt | Microservices / Verteilte APIs / OAuth2 |
3. Häufige JWT-Vulnerabilitäten, die vermieden werden sollten
1. Die "alg: none"-Vulnerabilität
Einige schlecht geschriebene Bibliotheken akzeptieren Token, bei denen alg auf none gesetzt ist, und überspringen die Signaturvalidierung. Stellen Sie immer explizit sicher, dass in der Server-Middleware nur erlaubte Algorithmen akzeptiert werden.
2. Algorithmus-Verwirrung-Angriff (HS256 vs RS256)
Wenn ein Server RS256 (asymmetrisch) erwartet, aber HS256 erhält, kann ein Angreifer das Token mit dem Serverschlüssel als geheimem Schlüssel signieren. Überprüfen Sie den Tokenalgorithmus vor der Signaturauswertung.
3. Fehlende Ablaufdatum (exp)-Überprüfung
Token ohne Ablaufdatum leben ewig. Stellen Sie immer sicher, dass kurze Lebensdauer (z.B. 15 Minuten) für Zugriffstoken und Refresh-Token-Rotation vorgesehen ist.
4. Entwickler-Tools auf Teksolvr
Inspektion und Debugging von Token sicher mit Teksolvr-Tools:
- Dekodieren Sie Header und Ansprüche mit unserem Online-JWT-Decoder.
- Testen Sie Regex-Validierungsregeln mit dem Regex-Tester.
- Generieren Sie zufällige Geheimnisse mit dem Password- & Schlüsselgenerator.
5. Beispielverwendungen
- Authentifizierung: Verwenden Sie JWT für stateless Authentifizierung in REST-APIs, Microservices und Single-Page-Anwendungen (SPAs).
- Autorisierung: Verwenden Sie JWT, um Benutzerrollen und Berechtigungen zu speichern, und ermöglichen Sie feinmaschige Zugriffssteuerung.
- Sitzungsverwaltung: Verwenden Sie JWT, um Benutzersitzungen zu verwalten, und eliminieren Sie die Notwendigkeit von serverseitiger Sitzungsverwaltung.
6. Sicherheitsbest Practices
- Verwenden Sie HTTPS, um Token-Interception und -Manipulation zu verhindern.
- Stellen Sie sicher, dass kurze Zugriffstoken und Refresh-Token-Rotation vorgesehen sind.
- Verwenden Sie einen sicheren Zufallszahlengenerator, um geheime Schlüssel zu generieren.
- Implementieren Sie Token-Blacklisting, um Token-Wiederverwendung zu verhindern.
- Rotieren Sie regelmäßig geheime Schlüssel und Refresh-Token.
7. Referenzen
- RFC 7519: JSON Web Tokens (JWT)
- RFC 7515: JSON Web Signature (JWS)
- RFC 7516: JSON Web Encryption (JWE)
8. Bildkredite
Diagrammname
9. Fehlerbehebungskontrolle
- Überprüfen Sie die Token-Signatur und -Algorithmus.
- Überprüfen Sie die Token-Ablaufzeit und -Refresh-Token-Rotation.
- Stellen Sie sicher, dass ein sicheres Zufallszahlengenerator für die Generierung geheimer Schlüssel verwendet wird.
- Implementieren Sie Token-Blacklisting, um Token-Wiederverwendung zu verhindern.
10. Häufig gestellte Fragen
- Q: Was ist ein JWT-Token? A: Ein JWT-Token ist ein JSON-Objekt, das Ansprüche, eine Signatur und einen Header enthält.
- Q: Was ist der Unterschied zwischen symmetrischer und asymmetrischer Signierung? A: Symmetrische Signierung verwendet einen geteilten geheimen Schlüssel, während asymmetrische Signierung einen öffentlichen / geheimen Schlüsselpaar verwendet.
- Q: Wie verhindere ich die "alg: none"-Vulnerabilität? A: Stellen Sie immer sicher, dass in der Server-Middleware nur erlaubte Algorithmen akzeptiert werden.
11. Schlussfolgerung
JSON Web Tokens (JWT) sind eine weit verbreitete Methode zur sicheren Darstellung von Ansprüchen zwischen zwei Parteien. Allerdings kann eine fehlerhafte Implementierung der JWT-Verifizierung kritische Authentifizierungsbypass-Vulnerabilitäten einleiten. Durch die Einhaltung von Sicherheitsbest Practices, wie der Verwendung von HTTPS, der Einführung kurzer Zugriffstoken und der Implementierung von Token-Blacklisting, können Sie sicherstellen, dass JWT-Tokens in Ihren Anwendungen sicher und zuverlässig verwendet werden.