JWT erklärt: Wie JSON-Web-Tokens funktionieren
JSON-Web-Tokens (JWTs) sind in der modernen Web-Authentifizierung allgegenwärtig – wenn Sie sich bei fast jeder App anmelden, ist wahrscheinlich ein JWT im Spiel. Dennoch werden sie weitgehend missverstanden, und dieses Missverständnis führt zu echten Sicherheitsfehlern. Hier erfahren Sie im Klartext, wie sie tatsächlich funktionieren.
Was ein JWT ist
Ein JWT ist ein kompaktes, eigenständiges Token, das Informationen („Ansprüche“) über einen Benutzer oder eine Sitzung enthält. Nachdem Sie sich angemeldet haben, stellt Ihnen ein Server ein JWT aus. Sie senden es bei jeder Anfrage zurück und der Server vertraut ihm, weil es kryptografisch signiert ist. Dies ist eine Möglichkeit zu beweisen, dass ich authentifiziert bin, ohne dass der Server den Sitzungsstatus speichert.
Die drei Teile
Ein JWT besteht aus drei Base64URL-codierten Abschnitten, die durch Punkte getrennt sind: header.payload.signatur.
- Header – der Tokentyp und der Signaturalgorithmus.
- Nutzlast – die Ansprüche: Benutzer-ID, Rollen, Ablaufzeit usw.
- Signatur – ein kryptografisches Siegel, das beweist, dass das Token nicht manipuliert wurde.
Fügen Sie ein beliebiges Token in unseren JWT-Decoder ein, um die Anordnung dieser Teile anzuzeigen. Der Standard ist in RFC 7519 definiert.
Der entscheidende Sicherheitsvorbehalt
Hier ist der Fehler, den die Leute machen: Der Header und die Nutzlast sind nur Base64-codiert, nicht verschlüsselt. Jeder, der ein JWT abfängt, kann die Nutzlast sofort entschlüsseln und lesen. Fügen Sie also niemals Geheimnisse – Passwörter oder sensible persönliche Daten – in eine JWT-Nutzlast ein. Die Signatur verhindert Manipulation, nicht Lesen. (Siehe unseren Leitfaden zu warum Base64 keine Sicherheit bietet.)
Wie die Signatur Sie schützt
Der Server signiert das Token mit einem geheimen Schlüssel. Ändert jemand die Nutzlast, stimmt die Signatur nicht mehr überein und der Server lehnt sie ab. Dadurch kann der Server einem Token vertrauen, den er nicht gespeichert hat – er kann die Authentizität mathematisch überprüfen.
Ablauf ist wichtig
Da JWTs eigenständig sind, können Sie sie nicht einfach „widerrufen“, bevor sie ablaufen. Aus diesem Grund beinhalten gut gestaltete Token eine kurze Ablaufdauer (der exp-Anspruch) und Apps verwenden Aktualisierungstoken, um neue auszugeben. Langlebige JWTs stellen ein Sicherheitsrisiko dar.
Signaturalgorithmen: HMAC vs. RSA
Der Header gibt an, wie ein Token signiert wird, und es gibt zwei gemeinsame Familien. HMAC (z. B. HS256) verwendet ein einziges gemeinsames Geheimnis zum Signieren und Verifizieren – einfach, aber jede Partei, die verifiziert, muss das Geheimnis besitzen. RSA/ECDSA (z. B. RS256) verwendet einen privaten Schlüssel zum Signieren und einen separaten öffentlichen Schlüssel zum Überprüfen, sodass Sie viele Dienste Tokens überprüfen lassen können, ohne jemals das Signaturgeheimnis preiszugeben. Bei verteilten Systemen ist asymmetrisches Signieren meist die sicherere Wahl; Für ein einzelnes Backend ist HMAC in Ordnung.
Wo soll ein JWT im Browser gespeichert werden?
Eine praktische Sicherheitsfrage: Wo befindet sich der Token auf der Clientseite? localStorage ist praktisch, aber von jedem JavaScript lesbar, was es anfällig für XSS-Angriffe macht, die das Token stehlen. Ein HttpOnly-Cookie kann von JavaScript nicht gelesen werden, was XSS beeinträchtigt, benötigt aber CSRF-Schutz. Es gibt keine perfekte Antwort – es ist ein Kompromiss – aber das Speichern sensibler Token im einfachen localStorage auf einer Site mit einem XSS-Risiko ist bekanntermaßen eine Taktik, die es zu vermeiden gilt.
Die Sicherheitslücke „alg: none“
Eine berühmte JWT-Falle: Einige Bibliotheken akzeptierten in der Vergangenheit Token mit dem Algorithmus „none“, also überhaupt keine Signatur – und ermöglichten es Angreifern, jede gewünschte Nutzlast zu fälschen. Die Lektion besteht darin, die Signatur immer mit einem expliziten, erwarteten Algorithmus zu überprüfen und niemals dem Algorithmus zu vertrauen, den das Token selbst deklariert. Verwenden Sie eine gut gepflegte Bibliothek, fixieren Sie den Algorithmus und ein JWT bleibt ein robuster, manipulationssicherer Berechtigungsnachweis.
Fazit
Ein JWT ist ein signiertes, eigenständiges Token aus drei Base64URL-Teilen: Header, Nutzlast und Signatur. Die Signatur garantiert Integrität, aber die Nutzdaten sind für jedermann lesbar. Halten Sie daher Geheimnisse fern, legen Sie kurze Ablauffristen fest und entschlüsseln Sie Token mit einem Tool, wenn Sie sie überprüfen müssen.