Zum Inhalt springen

JWT dekodieren

Header, Claims und Ablaufzeit eines JSON Web Token ansehen. Ein Token ist ein funktionierender Zugangsnachweis, daher wird hier nichts gesendet und nie etwas gespeichert.

  • Nie gespeichert
  • Keine Warteschlange, kein Warten
  • Ohne Anmeldung, ohne Wasserzeichen

Ihr Token verlässt diese Seite nie. Es wird direkt hier dekodiert, ohne Anfrage an einen Server – und das ist wichtig, denn ein JWT ist meist ein gültiger Zugangsnachweis. Schalten Sie nach dem Laden der Seite Ihr WLAN aus, und es wird trotzdem dekodiert: Es wird nichts gesendet.

Das Präfix „Bearer “ ist kein Problem – es wird ignoriert.

So funktioniert’s

1

Token einfügen

Mit oder ohne das Präfix „Bearer “. Es bleibt auf dieser Seite; es wird keine Anfrage gestellt.

2

Die drei Teile lesen

Header, Payload und Signatur, jeweils dekodiert und formatiert. Zeitstempel werden zu echten Datumsangaben, und Sie sehen, wie viel Zeit noch bleibt.

3

Die Warnungen prüfen

Abgelaufene Tokens, fehlender Ablauf, der Algorithmus „none“ und andere Probleme werden benannt – mit dem, was sie bedeuten.

Was geprüft und was nur gelesen wird

Alles auf dieser Seite außer zwei Datumsvergleichen ist reine Abschrift. Header und Payload werden Base64URL-dekodiert und ausgegeben; die Signatur wird herauskopiert und nie angefasst, denn hier gibt es keinen Schlüssel, und es läuft überhaupt keine Kryptografie. Die beiden Urteile, die die Seite fällt, sind Rechnungen gegen die Uhr Ihres eigenen Geräts – der Ablauf-Claim verglichen mit jetzt und der Nicht-vor-Claim verglichen mit jetzt. Eine Uhrabweichung wird nicht berücksichtigt, während ein Server, der dasselbe Token prüft, normalerweise ein bis zwei Minuten Spielraum lässt. Ein Laptop, dessen Uhr fünf Minuten vorgeht, zeigt Ihnen ein gültiges Token als abgelaufen an, obwohl mit dem Token alles in Ordnung ist.

Zwei Details beim Parsen bestimmen, was Sie tatsächlich sehen. Die Zeit-Claims werden nur gelesen, wenn sie als JSON-Zahlen ankommen: Ein Token, dessen Ablauf als Zeichenfolge „1699999999“ geschrieben ist, gilt als Token ohne Ablauf und bekommt die Warnung, dass es nie von selbst abläuft – das Gegenteil der Wahrheit. Und die Payload wird mit dem browsereigenen JSON-Parser gelesen, nicht mit dem ziffergenauen hinter unseren JSON-Tools, daher wird ein numerischer 64-Bit-Claim – etwa eine Snowflake-Benutzer-ID im Subject – mit gerundeten letzten Ziffern angezeigt. Kennungen in einem JWT sind meist genau aus diesem Grund Zeichenfolgen; ist eine es nicht, lesen Sie sie aus der rohen Payload statt aus der Claims-Tabelle.

Ein Token mit fünf Abschnitten wird als verschlüsseltes JWE abgewiesen, und dieses Urteil beruht allein auf der Zahl der Abschnitte, nicht auf dem Header – in der Praxis richtig, aber gut zu wissen, dass es eine Abkürzung ist. Alles, was nicht aus drei Abschnitten besteht, wird direkt abgewiesen, ebenso eine Payload, die zu einem JSON-Array oder einer bloßen Zeichenfolge statt zu einem Objekt dekodiert wird. Warnungen gibt es für den Algorithmus „none“ und für die HS-Familie, bei der der Signaturschlüssel ein gemeinsames Geheimnis statt eines öffentlichen Schlüssels ist. Mit RS, ES oder PS signierte Tokens lösen keine Warnung aus, Stille auf dieser Seite bedeutet also nur das Fehlen eines bekannten schlechten Musters – keine Freigabe.

Wenn Sie etwas anderes brauchen

Hier wird nichts gespeichert – nur deshalb kann diese Seite überhaupt sinnvoll existieren –, und trotzdem ist das nicht die Gewohnheit, die man sich zulegen sollte. Eine Datenschutzaussage lässt sich nicht durch Lesen prüfen: Trennen Sie nach dem Laden der Seite die Verbindung und sehen Sie zu, wie der Decoder weiterarbeitet – genau das kann ein Tool mit einem Server dahinter nicht. Und wenn ein Token, das Sie irgendwo eingefügt haben, wo Sie es nicht überprüfen können, noch gültig ist, tauschen Sie es aus, statt darüber nachzugrübeln. Austauschen ist eine Minute Arbeit. Die Alternative ist ein langer Streit mit sich selbst über einen Zugang, der immer noch die Tür öffnet. Um ein Token auf dem Rechner statt im Tab zu lesen, genügt für die Payload eine Shell-Zeile: das zweite durch Punkte getrennte Feld mit cut herauslösen, mit base64 -d dekodieren und durch jq leiten.

Wenn die Frage lautet, ob ein Token echt ist, und nicht, was darin steht, ist dies schon vom Aufbau her die falsche Seite – ebenso wie jeder andere Online-Decoder. Die Verifizierung gehört dorthin, wo der Schlüssel bereits ist: in die JWT-Bibliothek Ihrer Sprache auf Ihrem Server, geprüft gegen das veröffentlichte JWKS des Ausstellers. Das sind ein paar Zeilen, es ist die einzige Antwort, die etwas bedeutet, und jede Website, die anbietet, das für Sie zu erledigen, verlangt genau das eine Geheimnis, das Sie nie einer Website geben sollten.

Häufig gestellte Fragen

Wird mein Token irgendwohin gesendet?

Nein – und bei dieser Seite ist das nicht eine Funktion, sondern der eigentliche Sinn. Ein JWT ist meist ein aktiver Zugangsnachweis: Wer es besitzt, kann bis zum Ablauf in Ihrem Namen handeln. Es in einen Online-Decoder einzufügen, der es an einen Server schickt, heißt, einen funktionierenden Schlüssel auszuhändigen, und kein Versprechen, nichts zu protokollieren, kann das rückgängig machen. Dieser Decoder ist schlichtes JavaScript in der Seite, die Sie gerade sehen. Es wird nichts gespeichert, nichts protokolliert, keine Anfrage gestellt. Schalten Sie nach dem Laden der Seite Ihr WLAN aus, und alles funktioniert genauso. Das ist der einfachste Weg, die Datenschutzaussage selbst zu überprüfen, statt uns einfach beim Wort zu nehmen.

Wird die Signatur verifiziert?

Nein, und das kann kein Online-Decoder ehrlicherweise ohne Ihren Signaturschlüssel. Dekodieren und Verifizieren sind völlig verschiedene Vorgänge. Dekodieren macht nur das Base64 des Tokens rückgängig – das kann jeder mit jedem Token, und es beweist überhaupt nichts darüber, ob das Token echt ist. Verifizieren heißt, die Signatur mit dem Geheimnis oder öffentlichen Schlüssel neu zu berechnen, mit dem sie erstellt wurde, und dieser Schlüssel sollte nie in eine Website eingefügt werden. Was Sie hier sehen, ist das, was das Token BEHAUPTET. Ob diese Angaben vertrauenswürdig sind, kann nur Ihr Server beantworten, der den Schlüssel besitzt.

Kann jemand ein JWT lesen, das ich ihm schicke?

Ja – vollständig, und das überrascht viele. Ein JWT ist signiert, nicht verschlüsselt. Header und Payload sind Base64, eine Kodierung ohne jedes Geheimnis, sodass jeder, der das Token abfängt, jeden Claim darin lesen kann. Die Signatur verhindert, dass jemand das Token VERÄNDERT; sie verhindert nicht, dass jemand es LIEST. Legen Sie nie etwas Vertrauliches in die Payload eines JWT: keine Passwörter, keine Kartennummern, keine persönlichen Daten, die Sie nicht auf eine Postkarte schreiben würden.

Was bedeutet die Warnung zum Algorithmus „none“?

Dass das Token angibt, unsigniert zu sein – und das ist einer der gravierendsten Befunde, die diese Seite meldet. `alg: none` ist eine dokumentierte Umgehung der Authentifizierung: Ein Angreifer nimmt ein echtes Token, ändert die Payload so, dass er Administrator ist, setzt den Algorithmus auf „none“, entfernt die Signatur – und eine Bibliothek, die dem Header vertraut, akzeptiert es. Jede ernstzunehmende JWT-Bibliothek blockiert das inzwischen standardmäßig, aber Implementierungen, die `alg` vertrauen, gibt es noch. Ein Token, das mit `alg: none` ankommt, sollte als Angriff gelten, bis das Gegenteil bewiesen ist.

Wie lese ich den Ablauf?

Das wird für Sie erledigt. `exp`, `iat` und `nbf` sind Unix-Zeitstempel – Sekunden seit 1970 –, die als bloße Zahlen unlesbar sind. Jeder wird als echtes Datum in Ihrer eigenen Zeitzone angezeigt, mit dem Hinweis, wie lange das her ist oder noch dauert, und ein abgelaufenes Token wird klar als solches benannt, statt dass Sie es selbst ausrechnen müssen. Auch ein Token ganz ohne `exp` wird markiert: Ein JWT, das nie abläuft, lässt sich nicht durch Ablauf entwerten und bleibt so lange gültig wie der Signaturschlüssel.

Mein Token hat fünf Teile, nicht drei

Dann ist es ein JWE – verschlüsselt statt nur signiert –, und sein Inhalt lässt sich ohne den Entschlüsselungsschlüssel tatsächlich nicht lesen. Die Seite erkennt diese Form und sagt Ihnen das, statt Ihnen Unsinn anzuzeigen. Fünf Teile bedeuten, dass die Payload echter Geheimtext ist; da gibt es nichts zu dekodieren.

Was sind die Standard-Claims?

Die registrierten sind: `iss` – wer es ausgestellt hat, `sub` – um wen es geht (meist eine Benutzer-ID), `aud` – für wen es bestimmt ist, `exp` – wann es abläuft, `nbf` – nicht gültig vor, `iat` – wann es ausgestellt wurde, und `jti` – eine eindeutige ID für das Token. Alles andere ist individuell festgelegt von dem, der das System gebaut hat. Jeder registrierte Claim ist in der Ausgabe mit seiner Bedeutung beschriftet, sodass Sie sich nicht merken müssen, welches Kürzel aus drei Buchstaben welches ist.

Gut zu wissen: Hier wird dekodiert, nicht verifiziert. Die Signatur eines JWT beweist, dass das Token nicht verändert wurde, und um sie zu prüfen, braucht man das Geheimnis oder den öffentlichen Schlüssel des Ausstellers – und den sollten Sie nie in eine Webseite einfügen. Behandeln Sie alles, was hier angezeigt wird, als behauptet, nicht als bewiesen, und verifizieren Sie auf Ihrem Server.

Dieses Tool auf Ihrer Website einbinden

Kostenlos für jeden Blog, jede Kursseite und jeden Hilfeartikel. Fügen Sie ein einziges Snippet ein, und Ihre Besucher können das Tool direkt auf Ihrer Seite nutzen.