JWT Token: Struktur und Sicherheit
JWTs sind kompakte, selbstbeschreibende Token, die Identität und Berechtigungen transportieren, aber nur dann sicher sind, wenn sie korrekt signiert und validiert werden.
Kompakte Beschreibung
JWT steht für JSON Web Token und ist ein weit verbreitetes Format für die Übertragung von Claims zwischen zwei Parteien. Ein JWT besteht aus drei Teilen: Header, Payload und Signatur, die durch Punkte getrennt und Base64Url-kodiert sind. Der Header enthält Metadaten wie Algorithmus und Token-Typ, der Payload enthält Claims wie Ablaufzeit, Aussteller und Nutzer-ID, und die Signatur sichert die Integrität und Authentizität. JWTs werden häufig für API-Authentifizierung und Authorization verwendet, bergen aber Sicherheitsrisiken, wenn sie falsch eingesetzt werden. Wichtige Regeln sind: kurze Gültigkeit, starke Algorithmen, korrekte Validierung von Aussteller und Audience, Verwendung von HTTPS und niemals sensible Daten im Payload speichern, da dieser lediglich kodiert, nicht verschlüsselt ist.
Wichtige Komponenten
Header
Der Header enthält typischerweise zwei Claims: alg für den verwendeten Algorithmus und typ für den Token-Typ. Er ist Base64Url-kodiert. Der Algorithmus sollte ein asymmetrisches Verfahren wie RS256 oder ein starkes symmetrisches Verfahren wie HS256 mit einem langen Geheimnis sein. Algorithmus none darf niemals akzeptiert werden.
Payload
Der Payload enthält die Claims. Standard-Claims sind sub für Subject, iss für Issuer, aud für Audience, exp für Ablaufzeit, iat für Ausstellungszeit, nbf für Not Before und jti für JWT ID. Anwendungsspezifische Claims wie rollen oder berechtigungen können hinzugefügt werden. Der Payload ist ebenfalls Base64Url-kodiert und für jeden lesbar, der das Token besitzt.
Signatur
Die Signatur entsteht, indem Header und Payload zusammengefasst und mit dem gewählten Algorithmus und dem Schlüssel signiert werden. Sie stellt sicher, dass das Token nicht verändert wurde. Der Empfänger prüft die Signatur mit dem öffentlichen oder symmetrischen Schlüssel des Ausstellers.
Base64Url-Kodierung
Base64Url ist eine URL-sichere Variante der Base64-Kodierung. Sie ersetzt Plus und Schrägstrich durch andere Zeichen und entfernt Padding. Sie ermöglicht die kompakte Darstellung von JSON-Daten in Tokens, die in URLs und Headern übertragen werden können.
Signaturen Algorithmen
RS256 nutzt RSA mit SHA-256 und ein Schlüsselpaar aus privatem und öffentlichem Schlüssel. Der Aussteller signiert mit dem privaten Schlüssel, der Empfänger prüft mit dem öffentlichen Schlüssel. HS256 nutzt ein gemeinsames Geheimnis. Asymmetrische Verfahren sind für verteilte Systeme besser geeignet.
Claims und Ablaufzeit
Claims sind die zentralen Daten im JWT. exp definiert die Ablaufzeit und ist besonders wichtig, um die Lebensdauer eines Tokens zu begrenzen. Kurze Gültigkeit reduziert das Risiko, wenn ein Token gestohlen wird. iat und nbf helfen, die Gültigkeitsperiode weiter einzuschränken.
Token-Validierung
Ein Resource Server muss beim Empfang eines JWT mindestens folgendes prüfen: Signatur, Ablaufzeit, Aussteller, Audience, Algorithmus und notwendige Claims. Fehlende oder falsche Prüfungen können zu unbefugtem Zugriff führen.
Token-Transport
JWTs werden meist im Authorization Header als Bearer Token übertragen. Der Header sieht beispielsweise so aus: Authorization: Bearer eyJhbGciOiJIUzI1NiIs… . Die Übertragung muss immer über HTTPS erfolgen, um Token-Diebstahl zu vermeiden.
Sicherheitsrisiken
Bekannte Risiken sind Algorithmus-Confusion, wo Angreifer den Algorithmus auf none ändern, schwache Schlüssel bei HS256, lange Gültigkeit, fehlende Audience-Prüfung und das Speichern sensibler Daten im Payload. Zusätzlich können gestohlene Tokens genutzt werden, solange sie gültig sind, daher ist kurze Lebensdauer wichtig.
JWK und JWKS
JWK steht für JSON Web Key, JWKS für JSON Web Key Set. JWKS ist eine Sammlung von öffentlichen Schlüsseln, die ein Resource Server nutzt, um JWTs zu validieren. Der Authorization Server veröffentlicht JWKS meist unter einer bekannten URL, sodass sich Schlüssel automatisch austauschen lassen.
Praxisbeispiel
Ein API-Client erhält nach erfolgreicher Anmeldung ein JWT Access Token. Der Token besteht aus drei Teilen, die Base64Url-kodiert sind.
Dekodierter Header:
{
"alg": "RS256",
"typ": "JWT"
}
Dekodierter Payload:
{
"sub": "user-98765",
"iss": "https://auth.example.com",
"aud": "https://api.example.com",
"exp": 1751300000,
"iat": 1751296400,
"scope": "read:orders write:orders"
}
Der vollständige Token wird im Authorization Header übertragen:
GET /api/v1/orders
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Der Resource Server prüft die Signatur mit dem öffentlichen Schlüssel, validiert exp, iss, aud und scope und erlaubt dann den Zugriff. Ist das Token abgelaufen oder die Signatur ungültig, antwortet der Server mit 401 Unauthorized.
FAQ: JWT Token
1. Was ist ein JWT?
2. Wie ist ein JWT aufgebaut?
3. Was sind Claims?
4. Ist der Payload eines JWT verschlüsselt?
5. Was ist die Signatur eines JWT?
6. Was ist der Unterschied zwischen RS256 und HS256?
7. Was bedeutet Algorithmus none?
8. Was ist Algorithmus-Confusion?
9. Was ist JWKS?
10. Warum sollte ein JWT kurzlebig sein?
11. Was ist ein Bearer Token?
12. Wie validiert man ein JWT?
13. Was ist ein Refresh Token?
14. Sollte man JWTs im Browser speichern?
15. Was sind typische JWT Sicherheitsfehler?
Quellen
- https://datatracker.ietf.org/doc/html/rfc7519
- https://datatracker.ietf.org/doc/html/rfc7517
- https://datatracker.ietf.org/doc/html/rfc7518
Buchempfehlungen zur API-Sicherheit
Wenn Du Dich weiter mit JWT, Token-Sicherheit und API-Sicherheit beschäftigen möchtest, empfehlen wir Dir die folgenden Bücher:
Keine Bücher für Kategorie "security" gefunden.