JWT (JSON Web Token)
Kurz: Ein kompakter, signierter Datensatz, mit dem ein Server bestätigt, wer jemand ist und was er darf, ohne jedes Mal in der Datenbank nachzuschlagen.
Genauer: Ein JWT besteht aus drei Teilen, durch Punkte getrennt: Header, Payload und Signatur. Die ersten beiden sind JSON, nach dem Verfahren Base64URL kodiert, die dritte ist eine kryptografische Signatur darüber. Man erhält also einen langen Text wie xxxxx.yyyyy.zzzzz, den Browser oder Apps bei jeder Anfrage mitschicken (meist im Header Authorization: Bearer <token>).
Im Detail
Die drei Teile
Header: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"42","name":"Anna","exp":1790000000}
Signatur: HMAC_SHA256(base64url(header) + "." + base64url(payload), geheimer_schluessel)Der Header nennt das Signaturverfahren. Die Payload enthält Aussagen („Claims“) wie sub (Wer?), iat (ausgestellt am), exp (gültig bis) und eigene Felder wie die Rolle. Die Signatur garantiert, dass niemand Header oder Payload nachträglich geändert hat.
Wichtig: Signiert heißt nicht verschlüsselt
Jeder kann Header und Payload lesen, denn Base64URL ist nur eine Schreibweise, keine Verschlüsselung. Deshalb gehören keine Passwörter oder geheimen Daten in ein JWT. Nur die Signatur verhindert Fälschungen.
Signaturverfahren
- HS256 (symmetrisch): Aussteller und Prüfer teilen sich ein gemeinsames Geheimnis (HMAC). Einfach, aber jeder, der prüfen kann, könnte auch ausstellen.
- RS256 / ES256 (asymmetrisch): Aussteller signiert mit einem privaten Schlüssel, alle anderen prüfen mit dem öffentlichen. Besser, wenn viele Dienste prüfen müssen.
Typische Fehler und Angriffe
alg: none: Manche Bibliotheken akzeptierten früher unsignierte Tokens. Die Prüfung muss das erwartete Verfahren festlegen, nicht aus dem Token übernehmen.- Fehlende Ablaufzeit: Ohne
expbleibt ein gestohlener Token ewig gültig. Kurze Laufzeiten (Minuten) plus ein Erneuerungs-Token sind üblich. - Speicherort im Browser: Im
localStoragekann ein Token durch XSS gestohlen werden; einHttpOnly-Cookie ist dagegen geschützt, braucht aber Schutz vor Cross-Site-Anfragen (CSRF). - Widerruf: Ein JWT lässt sich nicht einfach „zurückrufen“, weil der Server nichts speichert. Abhilfe: kurze Laufzeit oder eine Sperrliste.
JWT oder Sitzung (Session)?
Bei klassischen Sitzungen merkt sich der Server eine Zufalls-ID und schlägt sie nach; Abmelden und Sperren sind trivial. JWTs sparen die Abfrage und eignen sich, wenn mehrere unabhängige Dienste dieselbe Anmeldung nutzen. Für eine einzelne Webseite sind Sitzungen oft einfacher und sicherer.
Ansehen und prüfen
Zum Debuggen kann man ein JWT in einem Dekodierer einfügen und die Claims lesen, ohne den Schlüssel zu kennen. Echtheit lässt sich nur mit dem Schlüssel prüfen. Tokens aus dem Live-Betrieb gehören nicht in fremde Online-Werkzeuge; lieber ein Werkzeug nutzen, das lokal im Browser rechnet.
Siehe auch: Authentifizierung, Signatur, JSON