So dekodieren Sie ein JWT
- Fügen Sie das Token in Token ein. Eine ganze Zeile
Authorization: Bearer eyJ…funktioniert, ebenso umgebende Anführungszeichen oder ein über mehrere Zeilen umbrochenes Token. - Lesen Sie das Ergebnis. Die drei Teile werden in unterschiedlichen Farben gezeigt, Header und Payload werden formatiert, und Claims listet jeden Claim mit seiner Bedeutung. Zeiten wie
expundiaterscheinen als Ortszeit, UTC und relative Zeit im Stil von „läuft in 1 Stunde ab“. - Um die Signatur zu prüfen, fügen Sie unter Signatur prüfen das gemeinsame Secret oder den öffentlichen Schlüssel ein. Die Feldbezeichnung richtet sich nach dem
algdes Tokens: Secret bei HS256/384/512, Öffentlicher Schlüssel bei allen anderen. - Lesen Sie die Warnungen. Das Tool markiert
alg: none, abgelaufene Tokens, einnbfin der Zukunft, ein fehlendesexp, Zeiten in Millisekunden sowie Header, die auf entfernte Schlüssel verweisen (jku,x5u) oder einen eigenen Schlüssel einbetten (jwk).
Sie können ein Token auch direkt über einen Link wie /jwt-decoder/#token=eyJ… öffnen. Der Teil nach # ist ein URL-Fragment, und Browser senden Fragmente nie an den Server.
Was in einem Token steckt
Ein signiertes JWT (ein JWS in kompakter Form) besteht aus drei Base64URL-Zeichenketten, verbunden durch Punkte: header.payload.signature. Hier ein echtes HS256-Token, ausgestellt am 1. Januar 2026 und eine Stunde gültig:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJzdWIiOiJ1c2VyLTQyIiwiYXVkIjoiYXBpLmV4YW1wbGUuY29tIiwiaWF0IjoxNzY3MjI1NjAwLCJleHAiOjE3NjcyMjkyMDB9.U3Gb12hN5Fnpi1rJ7nrkUzIEidkg-hPnbgiIpTah3R4
Der erste Teil ergibt dekodiert den Header {"alg":"HS256","typ":"JWT"}. Der zweite ist die Payload:
{"iss":"https://auth.example.com","sub":"user-42","aud":"api.example.com","iat":1767225600,"exp":1767229200}
Der dritte Teil sind 32 Bytes HMAC-SHA256, berechnet über die ersten beiden Teile; ändert sich ein einziges Zeichen in Header oder Payload, stimmt er nicht mehr. Fast jedes JWT beginnt mit eyJ, dem Base64 von {". Die Teile verwenden das URL-sichere Alphabet (- und _) ohne =-Padding; Wie JWT Base64URL nutzt zeigt, wie man eines von Hand dekodiert.
JWS oder JWE: signierte und verschlüsselte Tokens
Die meisten JWTs sind JWS: signiert und für jeden lesbar. Ein JWE ist verschlüsselt und hat fünf statt drei Teile: header.encrypted_key.iv.ciphertext.tag. Sein Header bleibt lesbar und nennt den Algorithmus für die Schlüsselverwaltung (alg, zum Beispiel RSA-OAEP-256 oder dir) und die Inhaltsverschlüsselung (enc, zum Beispiel A256GCM).
Fügen Sie hier ein JWE ein, dekodiert das Tool diesen Header, zeigt alg, enc und kid und markiert die Payload als verschlüsselt. Zum Entschlüsseln braucht man den privaten Schlüssel des Empfängers oder den gemeinsamen Schlüssel, und dieses Tool entschlüsselt kein JWE. Brauchen Sie ein Token, dessen Payload Nutzer nicht lesen können, ist JWE das richtige Format; Geheimnisse in die Payload eines JWS zu schreiben ist dasselbe, wie sie im Klartext abzulegen, wie Base64 ist keine Verschlüsselung erklärt.
Übersicht der JWT-Claims
Die ersten sieben Zeilen sind die registrierten Claims aus RFC 7519; die übrigen sind in Tokens von OpenID Connect und OAuth verbreitet. Jeder Zeitwert ist ein NumericDate: ganze Sekunden seit dem 01.01.1970 UTC, nie Millisekunden.
| Claim | Name | Was zu prüfen ist |
|---|---|---|
iss | Aussteller | Wer das Token erstellt und signiert hat. Muss zu dem Aussteller passen, dem Sie vertrauen. |
sub | Subjekt | Der Nutzer oder die Entität, um die es im Token geht, oft eine Nutzer-ID. |
aud | Zielgruppe | Für wen das Token bestimmt ist. Eine Zeichenkette oder ein Array; Ihre API sollte Tokens ablehnen, die an jemand anderen adressiert sind. |
exp | Ablaufzeit | Nach diesem Zeitpunkt muss das Token abgelehnt werden. |
nbf | Nicht vor | Vor diesem Zeitpunkt ist das Token noch nicht gültig. |
iat | Ausgestellt am | Wann es ausgestellt wurde. Nützlich für Altersgrenzen. |
jti | JWT-ID | Eine eindeutige ID, um Replays zu erkennen oder ein einzelnes Token zu widerrufen. |
azp | Autorisierte Partei | Der OAuth-Client, für den das Token ausgestellt wurde (OpenID Connect). |
scope, scp | Scopes | Gewährte OAuth-Scopes; scp ist die Schreibweise von Microsoft und Okta. |
nonce | Nonce | Bindet ein ID-Token von OpenID Connect an die Login-Anfrage, die es angefordert hat. |
auth_time | Authentifizierungszeit | Wann sich der Nutzer tatsächlich angemeldet hat, was lange vor iat liegen kann. |
roles, groups | Rollen, Gruppen | Autorisierungsdaten, die der Identity Provider ergänzt. |
tid, oid | Tenant, Objekt-ID | Kennungen für Tenant und Nutzerobjekt in Microsoft Entra ID. |
Der Header hat eigene Parameter: alg (der Signaturalgorithmus), typ (meist JWT, oder at+jwt bei OAuth-Access-Tokens), kid (welcher Schlüssel signiert hat) und cty (auf JWT gesetzt, wenn ein Token in einem anderen verschachtelt ist).
Die Signatur prüfen: welchen Schlüssel einfügen
Nur die Signaturprüfung zeigt, woher ein Token stammt. Welchen Schlüssel sie braucht, hängt von der Algorithmusfamilie im Header ab.
alg | Einzufügender Schlüssel | Signaturlänge |
|---|---|---|
| HS256, HS384, HS512 | Das gemeinsame Secret. Stellen Sie Secret als auf Text, Base64/Base64URL oder Hex, je nachdem, wie es gespeichert ist; ein oct-JWK funktioniert auch. | 32, 48, 64 Bytes |
| RS256–RS512, PS256–PS512 | Der öffentliche RSA-Schlüssel: PEM BEGIN PUBLIC KEY, PEM BEGIN RSA PUBLIC KEY, ein X.509-Zertifikat, ein JWK oder ein JWKS. | Schlüsselgröße; 256 Bytes bei RSA-2048 |
| ES256, ES384, ES512 | Der öffentliche EC-Schlüssel auf P-256, P-384 oder P-521, in einer der obigen Formen. | 64, 96, 132 Bytes (rohes r‖s) |
| EdDSA | Ein öffentlicher Ed25519-Schlüssel als PEM oder OKP-JWK. | 64 Bytes |
Bei Tokens von einem Identity Provider liegen die öffentlichen Schlüssel unter der jwks_uri, die in https://<issuer>/.well-known/openid-configuration aufgeführt ist. Diese Seite kann die URL nicht abrufen, weil sie keine Verbindung zu anderen Servern aufbauen kann. Öffnen Sie sie daher in einem neuen Tab und fügen Sie das JSON ein. Bei einem JWKS wird der Schlüssel anhand der kid gewählt; hat das Token keine kid, wird jeder kompatible Schlüssel probiert.
ECDSA-Signaturen in DER-Form (bei ES256 meist 70 bis 72 Bytes statt 64) werden erkannt, umgewandelt und markiert, weil JWS rohes r‖s verlangt und viele Bibliotheken DER ablehnen. Ein eingefügter privater Schlüssel funktioniert ebenfalls (die öffentliche Hälfte wird abgeleitet), auch wenn man zum Prüfen nie einen braucht. ES256K und Ed448 werden nicht unterstützt, da WebCrypto sie nicht kennt.
Scheitert ein HS256-Token mit einem Secret, bei dem Sie sich sicher sind, ist das Secret oft irgendwo in Ihrer Konfiguration Base64-kodiert, und der Server dekodiert es vor der Verwendung. Stellen Sie Secret als auf Base64 und versuchen Sie es erneut.
Warum das Dekodieren eines Tokens hier sicher ist
Ein JWT in einem Authorization-Header ist bis zu seinem Ablauf eine funktionierende Zugangsberechtigung. Fügen Sie ein aktives Produktions-Token in eine Webseite ein, die es an einen Server schickt, kann der Betreiber dieses Servers es gegen Ihre API wiederverwenden, und von außen können Sie meist nicht erkennen, ob eine Seite das tut.
Auf dieser Seite laufen das Dekodieren und die Signaturprüfung mit WebCrypto in Ihrem Browser. Die Seite hat außerdem eine Content Security Policy, deren connect-src nur /cdn-cgi/rum erlaubt, wo Cloudflare Web Analytics die Seitenaufrufe zählt. Jede andere fetch-, XHR-, WebSocket- und Beacon-Anfrage, die die Seite versuchen könnte, blockiert der Browser. Sie können das selbst nachprüfen: Öffnen Sie in den Entwicklertools den Netzwerk-Tab und fügen Sie ein Token ein, oder schalten Sie nach dem Laden der Seite das WLAN ab und dekodieren Sie weiter.
Verwenden Sie trotzdem lieber Test-Tokens oder Tokens, die bald ablaufen. Wurde ein Produktions-Token irgendwo eingefügt, das Sie nicht kontrollieren, widerrufen Sie die Sitzung.
Abgelaufene Tokens, nbf und Uhrenabweichung
exp und nbf werden mit der Uhr des Prüfers verglichen, und Uhren driften. Ein Token von einem Server, dessen Uhr 30 Sekunden vorgeht, kann mit iat und nbf in der Zukunft ankommen und als „noch nicht gültig“ abgelehnt werden. JWT-Bibliotheken akzeptieren daher eine kleine Toleranz: leeway in PyJWT, clockTolerance in jsonwebtoken und jose.
Dieser Decoder vergleicht die Zeiten mit der Uhr Ihres Geräts und beschreibt das Ergebnis in Worten: „vor 2 Tagen abgelaufen“ bei exp, „noch nicht gültig“ mit der verbleibenden Zeit bei nbf, oder eine Warnung, dass iat in der Zukunft liegt, was auf die Uhr des Ausstellers hindeutet. Ein Wert wie 1767229200000 wird als Millisekunden markiert; als Sekunden gelesen läge er Zehntausende Jahre in der Zukunft, ein häufiger Fehler, wenn Code Date.now() statt Math.floor(Date.now() / 1000) verwendet.
Um die Claims im Code ohne Prüfung zu lesen, genügt die Standardbibliothek von Python:
import base64, json
def b64url_decode(part):
return base64.urlsafe_b64decode(part + "=" * (-len(part) % 4))
header_b64, payload_b64, signature_b64 = token.split(".")
print(json.loads(b64url_decode(payload_b64)))
In Node.js leistet JSON.parse(Buffer.from(payload_b64, "base64url").toString("utf8")) dasselbe. Für Autorisierungsentscheidungen verwenden Sie eine Bibliothek, die die Signatur prüft und die akzeptierten Algorithmen festlegt. Weitere Snippets stehen auf den Seiten zu Python und Node.js.
Um ein Token zum Testen zu erstellen oder neu zu signieren, nutzen Sie den JWT-Encoder. Ein einzelnes Segment lässt sich mit dem Base64URL-Decoder für sich dekodieren.
Häufige Fragen
Kann ich ein JWT ohne den geheimen Schlüssel dekodieren?
Ja. Header und Payload sind nur Base64URL-kodiertes JSON; jeder, der das Token hat, kann sie also lesen. Das Secret oder der öffentliche Schlüssel wird nur gebraucht, um zu prüfen, ob die Signatur echt ist.
Warum meldet der Decoder eine ungültige Signatur?
Meist ist der Schlüssel falsch oder liegt in der falschen Form vor. Prüfen Sie bei HS256, ob das Secret als Base64 oder Hex gespeichert ist, und stellen Sie Secret als passend ein. Achten Sie bei RS256 oder ES256 darauf, dass der öffentliche Schlüssel zur kid des Tokens gehört; fügen Sie ein ganzes JWKS ein, wählt das Tool den Schlüssel anhand der kid für Sie.
Wie sehe ich, wann ein JWT abläuft?
Am Claim exp. Er zählt die Sekunden seit dem 01.01.1970 UTC, und die Claims-Tabelle zeigt ihn als Ortszeit, UTC und relative Zeit wie „vor 2 Tagen abgelaufen“. Ein Token ohne exp läuft von selbst nie ab.
Kann dieses Tool ein JWE entschlüsseln?
Nein. Bei einem verschlüsselten Token aus fünf Teilen dekodiert es den geschützten Header und zeigt alg, enc und kid. Zum Entschlüsseln der Payload bräuchte man den privaten oder gemeinsamen Schlüssel des Empfängers.
Wird das Token beim Einfügen irgendwohin gesendet?
Nein. Dekodieren und Prüfen laufen in Ihrem Browser mit JavaScript und WebCrypto, und die Content Security Policy der Seite blockiert jede Netzwerkanfrage außer dem Seitenaufrufzähler von Cloudflare.