Einen JSON Web Token (JWT) decodieren
- Dashboard
- Dokumentation
- API
Was ist ein JWT (JSON Web Token)?
Ein JSON Web Token, abgekürzt JWT (ausgesprochen "jot"), ist ein kompaktes Format, das in der RFC 7519 definiert ist und es ermöglicht, eine Reihe von Behauptungen (Claims) zwischen zwei Parteien zu transportieren. Das JWT, oder JWT-Token, ist heute das dominante Format, um eine authentifizierte Identität in einer HTTP-API zu transportieren. Ein JWT erscheint als ASCII-Zeichenkette, die aus drei durch Punkte getrennten Segmenten besteht:
header.payload.signature
Jedes Segment ist in Base64URL kodiert, einer Base64-Variante ohne Padding
=, die + durch - und / durch _ ersetzt,
damit es ohne zusätzliches Escaping in einer URL oder einem HTTP-Header transportiert werden kann.
Wichtig: Ein JWT ist NICHT verschlüsselt. Das Standard-JWT-Format (JWS) ist lediglich signiert: Die Signatur garantiert die Integrität des Inhalts, bietet aber keinerlei Vertraulichkeit. Jeder kann das Payload eines JWT mit einem einfachen Base64URL-Inversen dekodieren, wie es dieses Online-jwt decode-Tool tut.
Anatomie eines JWT
Ein JSON Web Token besteht aus drei klar unterscheidbaren Teilen, von denen jeder eine präzise Rolle im Authentifizierungsmechanismus spielt:
1. Header
Der Header ist ein JSON-Objekt, das beschreibt, wie das Token signiert ist. Er enthält mindestens:
alg(algorithm): der verwendete Signaturalgorithmus. Typische Werte:HS256,RS256,ES256,EdDSA.typ(type): der Tokentyp, fast immer"JWT".kid(key ID): optional, identifiziert welcher Schlüssel zur Überprüfung der Signatur verwendet werden soll. Praktisch bei einem Bestand rotierender Schlüssel (JWKS).
2. Payload
Das Payload enthält die Claims, also die Behauptungen, die der Aussteller über den Benutzer oder die Sitzung macht. Die RFC 7519 definiert sieben Standard-Claims (registered claims):
iss(issuer): wer das Token ausgestellt hat, zum Beispiel"https://accounts.google.com".sub(subject): wem das Token gehört, in der Praxis die Benutzer-ID.aud(audience): an wen das Token gerichtet ist. Verhindert, dass ein für die API A ausgestelltes Token von der API B akzeptiert wird.exp(expiration time): Unix-Timestamp, nach dem das Token nicht mehr gültig ist.nbf(not before): Timestamp, vor dem das Token noch nicht aktiv ist.iat(issued at): Ausstellungs-Timestamp des Tokens.jti(JWT ID): eindeutiger Token-Bezeichner, verwendet für Widerruf und Replay-Prävention.
Zu diesen Standard-Claims kommen in der Regel Custom-Claims, die für
die Anwendung spezifisch sind (roles, scope, tenant_id, email,
permissions...).
3. Signatur
Die Signatur ist eine kryptografische Prüfsumme, berechnet über
base64url(header) + "." + base64url(payload) mithilfe eines Schlüssels. Sie beweist,
dass niemand den Header oder das Payload seit der Ausstellung verändert hat. Die gängigsten Algorithmen:
- HS256 / HS384 / HS512: symmetrische HMAC-SHA-Signatur. Ein zwischen Aussteller und Überprüfer geteilter geheimer Schlüssel. Einfach, aber ungeeignet, sobald es mehr als einen Konsumenten gibt.
- RS256 / RS384 / RS512: asymmetrische RSA-Signatur. Der Aussteller signiert mit seinem privaten Schlüssel, jeder Konsument überprüft mit dem entsprechenden öffentlichen Schlüssel. De-facto-Standard für OAuth2 und OpenID Connect.
- ES256 / ES384 / ES512: asymmetrische ECDSA-Signatur. Dieselben Eigenschaften wie RS256, aber mit deutlich kürzeren Schlüsseln und Signaturen.
- EdDSA (Ed25519): moderne asymmetrische Signatur, schnell und kompakt.
Nochmals: Die Signatur schützt die Integrität, nicht die Vertraulichkeit. Das Payload bleibt für jeden lesbar, der das Token besitzt.
Warum ein JWT dekodieren?
Die Operation jwt token decode deckt mehrere konkrete Bedürfnisse für einen Entwickler oder Sicherheitsingenieur ab:
- Authentifizierungs-Debugging: Ihre API gibt einen 401 oder 403 zurück, und Sie möchten sehen,
was sich tatsächlich im Payload befindet (
sub,scope,roles,exp), statt zu raten. - Claims überprüfen: bestätigen, dass ein Token tatsächlich die erwartete Behauptung
enthält (zum Beispiel
tenant_idoderpermissions), bevor man anderswo in der Autorisierungskette sucht. - Ablauf lesen: den
exp-Timestamp in ein menschliches Datum umwandeln, um zu bestätigen, dass ein Token tatsächlich abgelaufen ist, oder im Gegenteil, dass es noch gültig sein sollte. - Sicherheitsaudit: sicherstellen, dass ein Drittanbieterdienst keine sensiblen Informationen im Payload preisgibt (E-Mails, interne Bezeichner, personenbezogene Daten).
- Schulung und Verständnis: konkret sehen, wie ein jsonwebtoken aussieht, das von einem OAuth-Anbieter (Google, Auth0, Keycloak, AWS Cognito) ausgegeben wird, um die Mechanik zu verstehen, ohne in die Doku einzutauchen.
- Erkundung öffentlicher Tokens: ein in Logs, in einem Cookie oder in einem abfangbaren OAuth-Austausch gefundenes JWT inspizieren.
Decoder vs. Verifier: die kritische Unterscheidung
Die beiden Operationen wirken ähnlich, haben aber hinsichtlich der Sicherheitsgarantien nichts miteinander zu tun:
- Ein JWT dekodieren besteht darin, die Zeichenkette an den
.zu teilen und auf die beiden ersten Segmente ein Base64URL-Inverses anzuwenden. Das ist ein einfaches Lesen, in jedem Drei-Zeilen-Skript machbar. Es findet keine Signaturüberprüfung statt. - Ein JWT überprüfen besteht darin, die Signatur aus Header, Payload und einem Schlüssel neu zu berechnen und das Ergebnis mit der im Token vorhandenen Signatur zu vergleichen. Das ist es, was garantiert, dass das Token nicht gefälscht wurde.
Praktische Schlussfolgerung: Dekodieren bedeutet nicht Vertrauen. Solange die Signatur nicht mit dem richtigen Schlüssel überprüft wurde, kann der Inhalt des Payload völlig erfunden sein. Für die Vertrauensphase verwenden Sie unseren JWT Verifier.
So verwenden Sie es
- Holen Sie sich das zu inspizierende JWT, zum Beispiel aus einem
Authorization: Bearer <jwt>-Header, aus einem Session-Cookie, aus demlocalStoragedes Browsers oder aus einem Anwendungs-Log. - Fügen Sie die vollständige Zeichenkette in das Eingabefeld ein. Die drei Segmente müssen durch Punkte getrennt bleiben.
- Das Tool zeigt sofort den dekodierten Header als formatiertes JSON an, mit dem Algorithmus und dem Typ.
- Das Payload wird anschließend dekodiert und angezeigt. Sie sehen darin alle Standard- und Custom-Claims.
- Das Tool zeigt auch die Signaturinformation an (deklarierter Algorithmus, Länge), ohne sie zu überprüfen.
- Um zu bestätigen, dass das Token nicht gefälscht wurde, wechseln Sie zu unserem JWT Verifier mit dem öffentlichen Schlüssel oder dem erwarteten Secret.
Die gesamte Dekodierung erfolgt in Ihrem Browser in JavaScript: Ihr Token wird nie an unsere Server gesendet.
JWT und Sicherheit: die zu vermeidenden Fallen
Speichern Sie NIEMALS sensible Daten im Payload eines signierten JWT.
Passwörter, Kreditkartennummern, medizinische Daten, API-Secrets, kritische interne Bezeichner: Alles, was sich im Payload befindet, ist für jeden lesbar, der das Token besitzt, einschließlich des Benutzers selbst über die Entwicklerwerkzeuge seines Browsers. Die Signatur verbirgt nichts, sie beweist nur, dass der Aussteller tatsächlich der ist, der er vorgibt zu sein.
Einige goldene Regeln zur korrekten Verwendung von JWTs in der Produktion:
- Überprüfen Sie die Signatur immer serverseitig, bevor Sie irgendein Recht gewähren. Unser JWT Verifier illustriert genau diese Operation.
- Bevorzugen Sie RS256 oder ES256 gegenüber HS256 für öffentliche APIs. Die asymmetrische Signatur vermeidet das Teilen eines Secrets zwischen Aussteller und jedem Konsumenten.
- Halten Sie sich immer an den Claim
exp. Ein JWT ohne Ablauf oder mit zu fernem Ablauf ist eine Zeitbombe im Falle einer Kompromittierung. - Validieren Sie
issundaudserverseitig, um zu vermeiden, dass ein legitimes Token, das für einen anderen Dienst ausgestellt wurde, versehentlich akzeptiert wird. - Lehnen Sie
alg: "none"ab bei der Überprüfung. Das ist eine klassische Schwachstelle, die es einem Angreifer ermöglicht, jedes beliebige Payload zu schmieden. - Halten Sie die Lebensdauer kurz (zum Beispiel 15 Minuten) und koppeln Sie mit einem längeren, aber serverseitig widerrufbaren Refresh-Token.
Beispiel eines dekodierten JWT-Tokens
Hier ist ein typisches JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiSm9obiIsImlhdCI6MTUxNjIzOTAyMn0.jrU9j8LZcRK2_BZjqXjU7lEpJbkqmXfTQIu9vT45j-I
Einmal dekodiert, ist hier sein Inhalt:
// Header
{
"alg": "HS256",
"typ": "JWT"
}
// Payload
{
"sub": "123",
"name": "John",
"iat": 1516239022
}
// Signature (binaire, encodé en Base64URL)
HMACSHA256(
base64url(header) + "." + base64url(payload),
secret
)
Wo findet man ein JWT zum Kopieren?
In der Praxis stammt ein zu dekodierendes (im Sinne von dekodierendes) JWT meist aus einem dieser Orte:
- HTTP-Cookie: Öffnen Sie die Entwicklerwerkzeuge (F12), Tab
Application oder Storage, dann Cookies. Suchen Sie nach einem Cookie namens
access_token,jwt,sessionoder ähnlich. localStorage/sessionStorage: Gleiches Panel, Abschnitt Local Storage. Viele SPAs speichern dort ihr Token unter einemtoken- oderauth-Schlüssel.Authorization-Header: Tab Network, eine API-Anfrage auswählen, den HeaderAuthorization: Bearer <jwt>lesen. Nur den Teil nachBearerkopieren.- Server-Logs: Ein JWT erscheint manchmal in den Logs eines Gateways oder eines Reverse-Proxys (in der Produktion zu vermeiden, aber beim Debuggen nützlich).
Häufig gestellte Fragen
Ist das JWT verschlüsselt oder im Klartext?
Ein signiertes JWT (Format JWS) ist nur in Base64URL kodiert, nicht verschlüsselt. Jeder, der ein Token abfängt, kann das Payload in Sekunden lesen. Wenn Sie wirklich vertrauliche Daten im Token transportieren müssen, müssen Sie das JWE-Format (JSON Web Encryption) verwenden, das eine Verschlüsselungsschicht über der Signatur hinzufügt. In der Praxis bleibt JWE selten: Man zieht es vor, keine sensiblen Daten in einem Token zu speichern und kritische Informationen serverseitig in einer Datenbank zu halten.
Wie widerruft man ein JWT vor seinem Ablauf?
Das ist einer der Schwachpunkte des JWT: Konstruktionsbedingt muss der Server den Token-Zustand nicht speichern,
daher weiß er auch nicht, wie er ihn als widerrufen markieren soll. Es gibt drei Ansätze.
Widerrufsliste: serverseitig die Liste der ungültigen
jti pflegen und sie bei jeder Anfrage konsultieren. Kurze Lebensdauern:
Access-Tokens mit 5 bis 15 Minuten Gültigkeit ausstellen und einen serverseitig widerrufbaren
Refresh-Token verwenden, um neue zu erzeugen. Signaturschlüssel-Rotation: eine ganze
Token-Generation durch Wechseln des Schlüssels invalidieren. Der zweite Ansatz ist bei weitem am
weitesten verbreitet.
Was ist der Unterschied zwischen einem JWT und einer klassischen Session?
Eine klassische Session speichert einen opaken Bezeichner clientseitig (in der Regel in einem Cookie) und behält alle zugehörigen Daten (Benutzer, Rechte, Ablauf) im Speicher oder in der Datenbank serverseitig. Ein JWT hingegen transportiert diese Daten direkt im signierten Token. Vorteil des JWT: Der Server muss keine Session speichern, was die horizontale Skalierung und die Microservices-Architektur vereinfacht. Nachteile: Der Widerruf ist komplexer, das Token ist bei jeder Anfrage größer, und die geringste Kompromittierung offenbart das Payload.
Unterschied zwischen JWT, JWS und JWE?
JWT (RFC 7519) ist ein generisches Tokenformat. Es kann auf zwei konkrete Arten implementiert werden: JWS (RFC 7515, JSON Web Signature), das sich darauf beschränkt, das Payload zu signieren, und JWE (RFC 7516, JSON Web Encryption), das es verschlüsselt. In der Praxis spricht man, wenn man von "JWT" ohne Präzisierung spricht, fast immer von einem JWS: ein signiertes, aber für alle lesbares Token. JWE wird in Kontexten verwendet, in denen die Vertraulichkeit des Payload unverzichtbar ist, zum Beispiel in einigen fortgeschrittenen OpenID-Connect-Szenarien.
Mein JWT wird von der API nicht akzeptiert, warum?
Die klassischen Ursachen sind, nach Häufigkeit: abgelaufenes Token (prüfen Sie
den Claim exp), ungültige Signatur (geheimer Schlüssel oder öffentlicher
Schlüssel stimmt nicht mit dem vom Aussteller verwendeten überein), falsches aud
(das Token wurde für einen anderen Dienst ausgestellt), falsches iss
(der deklarierte Aussteller ist nicht der erwartete), abgelehnter Algorithmus (die API verlangt
zum Beispiel RS256 und erhält ein HS256), nicht synchronisierte Uhren zwischen
Aussteller und Überprüfer (wirkt sich auf exp und nbf aus). Das Token mit diesem Tool zu
dekodieren ermöglicht es bereits, die Hälfte der Hypothesen zu eliminieren, indem man direkt die
Claims liest.
Wie erzeugt man ein JWT?
Die meisten Sprachen haben eine dedizierte Bibliothek: jsonwebtoken in
Node.js, PyJWT in Python, lcobucci/jwt oder
firebase/php-jwt in PHP, jjwt in Java, golang-jwt/jwt
in Go. Alle nehmen ein Payload-Objekt, einen Schlüssel und einen Algorithmus entgegen und geben die
Zeichenkette header.payload.signature zum Senden zurück. Es wird dringend abgeraten,
die Generierung von Hand zu implementieren: Die Kryptografie enthält zu viele Fallen (nicht konstante
Vergleiche, falsche Behandlung von alg: none usw.).
Akzeptiert der Decoder ein abgelaufenes JWT?
Ja. Der Decoder begnügt sich damit, den Tokeninhalt anzuzeigen, ohne ein Urteil über seine
zeitliche Gültigkeit zu fällen. Er bewertet weder exp noch nbf noch die Signatur.
Das ist nützlich, um zu verstehen, warum ein Token von einer API abgelehnt wurde: Man kann
den Wert von exp mit der aktuellen Uhrzeit vergleichen, um zu bestätigen, dass es tatsächlich
abgelaufen ist.
Ist mein JWT gültig, wenn der Decoder es korrekt anzeigt?
Nein. Die Anzeige beweist nur, dass die Zeichenkette wohlgeformt ist (drei durch Punkte getrennte Segmente, korrekte Base64URL-Kodierung, gültiges JSON im Header und Payload). Das sagt nichts über die Authentizität des Tokens. Ein vollständig gefälschtes JWT kann ohne Fehler in einem Decoder angezeigt werden, genau deshalb muss man es an einen Verifier übergeben.
Beispielanfrage
curl -X POST https://cdrn.fr/api/v1/tools/jwt-decoder/execute \
-H "Content-Type: application/json" \
-d '{"token":"..."}'
Eingabeschema
| Feld | Typ | Erforderlich | Standard |
|---|---|---|---|
token |
text | ✓ | – |
Endpunkte
GET https://cdrn.fr/api/v1/tools- listet alle verfügbaren Tools aufGET https://cdrn.fr/api/v1/tools/jwt-decoder- liefert das Schema dieses ToolsPOST https://cdrn.fr/api/v1/tools/jwt-decoder/execute- führt dieses Tool mit einem JSON-Payload aus