Einen JSON Web Token (JWT) decodieren

decodiert Ihr JWT (JSON Web Token) und zeigt die enthaltenen Informationen lesbar und strukturiert an

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_id oder permissions), 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

  1. Holen Sie sich das zu inspizierende JWT, zum Beispiel aus einem Authorization: Bearer <jwt>-Header, aus einem Session-Cookie, aus dem localStorage des Browsers oder aus einem Anwendungs-Log.
  2. Fügen Sie die vollständige Zeichenkette in das Eingabefeld ein. Die drei Segmente müssen durch Punkte getrennt bleiben.
  3. Das Tool zeigt sofort den dekodierten Header als formatiertes JSON an, mit dem Algorithmus und dem Typ.
  4. Das Payload wird anschließend dekodiert und angezeigt. Sie sehen darin alle Standard- und Custom-Claims.
  5. Das Tool zeigt auch die Signaturinformation an (deklarierter Algorithmus, Länge), ohne sie zu überprüfen.
  6. 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 iss und aud serverseitig, 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, session oder ähnlich.
  • localStorage / sessionStorage: Gleiches Panel, Abschnitt Local Storage. Viele SPAs speichern dort ihr Token unter einem token- oder auth-Schlüssel.
  • Authorization-Header: Tab Network, eine API-Anfrage auswählen, den Header Authorization: Bearer <jwt> lesen. Nur den Teil nach Bearer kopieren.
  • 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 auf
  • GET https://cdrn.fr/api/v1/tools/jwt-decoder - liefert das Schema dieses Tools
  • POST https://cdrn.fr/api/v1/tools/jwt-decoder/execute - führt dieses Tool mit einem JSON-Payload aus