JWT Decoder
Füg einen Token ein und bekomm die Antwort, wegen der du eigentlich hier bist: ob er abgelaufen ist, was darin lesbar ist und ob der Header so gesetzt ist, dass ihn jemand missbrauchen könnte. Nichts wird hochgeladen, und dieser JWT Decoder fragt nie nach deinem Signing Secret.
Kostenlos · Ohne Anmeldung · Nichts verlässt deinen Browser
Dekodiert einen JWT in deinem Browser und sagt dir, weswegen du hier bist: ob er abgelaufen ist, was darin lesbar ist und ob der Header so gesetzt ist, dass ihn jemand missbrauchen könnte. Der Token wird nirgendwohin geschickt, und niemand fragt dich nach deinem Signing Secret.
1 Zeile · 319 Zeichen
4 Zeilen · 36 Zeichen
12 Zeilen · 220 Zeichen
PrüfenAbgelaufen
Ablauf: 2025-08-12 13:00:00 UTC · ausgestellt für 1 Stunde. Ausgestellt von Auth0. Signiert mit HS256 – die Signatur wird angezeigt, aber nicht geprüft, denn dafür braucht es den Key.
4 Punkte, die du kennen solltest
HinweisSigniert mit HS256 – einem geteilten Secret
HMAC heißt: Jeder Service, der diesen Token prüft, hat auch den Key, um einen auszustellen. Prüft mehr als ein Service, nimm besser RS256, damit nur der Aussteller signieren kann.GefahrAbgelaufen (458 Tage her)
Jeder korrekte Verifier lehnt ihn jetzt ab. Hat der Token eben noch funktioniert, ist das die Antwort.Prüfen2 Claims mit personenbezogenen Daten
email, name. Ein JWT-Payload ist base64, keine Verschlüsselung – lesen können ihn der Browser, jeder Proxy auf dem Weg und alles, was den Header loggt. Die Signatur schützt ihn vor Änderungen, nicht vor dem Lesen.HinweisKein Audience-Claim
Ohne aud ist ein Token, der für einen Service ausgestellt wurde, strukturell bei jedem anderen Service gültig, der demselben Aussteller vertraut.
Was die Claims bedeuten
- iss
- "https://tekk-demo.eu.auth0.com/"Issuer – wer den Token ausgestellt hat. Der Verifier sollte das prüfen, und eine Abweichung hier ist ein häufiger Grund für einen Token, der „eigentlich funktionieren müsste“.
- sub
- "auth0|6612f0c1a9e4"Subject – der User oder Service, um den es im Token geht. Meist die stabile User-ID, nicht die E-Mail.
- email (eigener)
- "ada@example.com"Kein registrierter Claim. Anwendungen fügen eigene hinzu; dem Verifier muss man sagen, dass er sie beachten soll.
- name (eigener)
- "Ada Lovelace"Kein registrierter Claim. Anwendungen fügen eigene hinzu; dem Verifier muss man sagen, dass er sie beachten soll.
- roles (eigener)
- ["admin","billing"]Kein registrierter Claim. Anwendungen fügen eigene hinzu; dem Verifier muss man sagen, dass er sie beachten soll.
- iat
- 2025-08-12 12:00:00 UTCAusgestellt am.
- exp
- 2025-08-12 13:00:00 UTCAblauf. Nach diesem Zeitpunkt muss der Token abgelehnt werden.
Der Token auf einen Blick
- Algorithmus
- HS256Auth0
- Claims
- 72 mit personenbezogenen Daten
- Lebensdauer
- 1 Stundeschon vorbei
- Größe
- 319Bytes, passt in ein Cookie
Alles läuft in deinem Browser – der Token wird nie hochgeladen, geloggt oder gespeichert, und kein Feld fragt nach deinem Signing Secret. Ein JWT aus einer echten Session ist ein gültiger Zugang, solange er gilt; einen davon in irgendeine Website einzufügen ist wie ein Passwort einzufügen.
Tekk lässt Loops über deine Codebase laufen, die finden, was sich verbessern lässt, und deinem Coding-Agent die Spec übergeben, sobald du es mit Greenlight freigibst – für den Fall, dass der Auth-Flow stimmt und die Integration drumherum nicht.
So funktioniert’s
- 1
Füg den Token ein, samt Bearer-Präfix
Er wird beim Tippen dekodiert. Ist das Eingefügte kein JWT, sagt dir dieser JWT Decoder stattdessen, was es ist – ein JWE, eine opake Session-ID, ein API-Key oder ein Token, der auf dem Weg aus einem Log sein letztes Segment verloren hat.
- 2
Lies zuerst die Zeile zum Ablauf
Vor vierzig Sekunden abgelaufen, wegen Clock Skew erst in zwei Minuten gültig oder gar kein exp-Claim. Das beantwortet die meisten Fragen, mit denen man zu einem JWT Debugger kommt – deshalb steht es ganz oben auf der Seite und nicht als Zahl, die du selbst umrechnen musst.
- 3
Dann lies die Befunde
alg auf none, ein Header, der auf eine Key-URL zeigt, die ein Angreifer kontrollieren kann, eine Lebensdauer in Monaten oder eine E-Mail-Adresse im Payload, die alle lesen können, die den Token haben. Jeder Befund sagt, warum er zählt, statt ihn nur zu benennen.
Ein JWT ist signiert, nicht verschlüsselt
Der Payload ist base64url. Das ist keine schwache Form von Verschlüsselung – es ist überhaupt keine Verschlüsselung. Es ist eine Kodierung, die alle umkehren können, in einer Zeile:
JSON.parse(atob(token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')))
Die Signatur verhindert, dass der Payload unbemerkt verändert wird. Sie tut nichts dagegen, dass er gelesen wird. Alle, die den Token in die Hand bekommen, sehen alles darin: der eigene Browser der Person, jeder Proxy auf dem Weg, dein CDN und alles, was einen Authorization-Header loggt – und das ist standardmäßig fast alles.
Ein JWT ist also der falsche Ort für eine E-Mail-Adresse, eine Telefonnummer, ein Geburtsdatum oder eine Gehaltsstufe. Genau deshalb listet diese Seite Claims auf, deren Namen nach personenbezogenen Daten aussehen.
Warum der Token abgelehnt wird
Fast jeder Besuch bei einem Decoder beginnt mit einem 401, das nicht passieren sollte. Ungefähr in der Reihenfolge, in der die Ursachen tatsächlich auftreten:
| Ursache | Was du siehst |
|---|---|
| Abgelaufen | exp liegt in der Vergangenheit. Offensichtlich, sobald du die Epoch-Zeit umrechnest – deshalb wird sie hier für dich umgerechnet. |
| Clock Skew | nbf oder iat liegt aus Sicht der prüfenden Seite in der Zukunft. Der Token ist wirklich neu und wird wirklich abgelehnt. Sporadisch und zum Verzweifeln, weil es davon abhängt, welcher Server ihn ausgestellt hat. |
| Falsche Audience | aud nennt einen anderen Service. Strukturell gültig, korrekt signiert, trotzdem abgelehnt. |
| Falscher Issuer | iss passt nicht zu dem, was die prüfende Seite festgelegt hat – meist ein Staging-Token gegen die Produktion. |
| Falscher Token-Typ | Ein ID-Token, wo ein Access-Token erwartet wurde. Beide sehen gleich aus. Der token_use-Claim von Cognito existiert einzig, um sie zu unterscheiden. |
| Abgeschnitten | Aus einem Log kopiert, das umgebrochen hat, sodass die Signatur ihr Ende verloren hat. Lässt sich problemlos dekodieren, aber nie verifizieren. |
Der Header ist eine Angriffsfläche
Der JOSE-Header ist keine Metadaten-Ablage. Er enthält Anweisungen, nach denen die prüfende Seite handeln kann, und drei davon solltest du jedes Mal prüfen:
alg: none– der Token ist nicht signiert. Eine Library, die dem Header vertraut, statt den erwarteten Algorithmus festzulegen, akzeptiert einen Payload, den jemand bearbeitet hat. Das ist CVE-2015-9235, zehn Jahre alt, und es taucht immer noch auf.jku/x5u– eine URL, von der die prüfende Seite den Key holen soll. Ohne Allowlist kontrolliert, wer den Token kontrolliert, auch den Key.jwk– der Key, eingebettet in genau den Token, den er authentifizieren soll. Zirkulär by Design.
Nichts davon ist exotisch. Es sind alles Standard-JOSE-Parameter aus RFC 7515, und jeder wird erst dann zur Schwachstelle, wenn die prüfende Seite dem Token etwas einfach glaubt.
HS256 oder RS256
HMAC heißt: Dasselbe Secret signiert und verifiziert. Jeder Service, der einen Token prüfen kann, kann also auch einen ausstellen – ein gemeinsames Secret, verteilt auf fünf Services, sind fünf Stellen, von denen aus ein Angreifer fälschen kann.
RSA und ECDSA trennen das: Der Aussteller signiert mit einem Private Key, alle anderen verifizieren mit dem Public Key. Wenn mehr als ein Service deine Tokens prüft, ist genau diese Asymmetrie der Sinn der Sache.
Der Angriff dazwischen heißt Algorithm Confusion: Nimm einen RS256-Token, ändere den Header auf HS256 und signiere ihn mit dem Public Key des Ausstellers als HMAC-Secret. Eine prüfende Seite, die den Algorithmus aus dem Token liest und den Public Key als „den Key“ übergibt, akzeptiert ihn.
Was diese Seite nicht tut
Sie prüft die Signatur nicht, und sie fragt nie nach deinem Key.
Bei HS256 braucht die Verifizierung dein Signing Secret. Ein Decoder, der dich bittet, eins in ein Webformular einzufügen, verlangt einen Zugang, der Tokens für dein gesamtes System ausstellen kann – im Tausch gegen die Bestätigung einer Signatur, die dein eigenes Backend ohnehin bei jedem einzelnen Request prüft. Das ist kein guter Tausch, und die Gewohnheit ist schlimmer als der Einzelfall.
Alles oben – Ablauf, Skew, Audience, Issuer, Header-Einstellungen, was im Payload lesbar ist – lässt sich allein aus dem Token feststellen.
Häufige Fragen
- Speichert oder verschickt ihr meinen Token?
- Nein. Der Decoder besteht aus ein paar Kilobyte JavaScript, die auf deinem Rechner laufen – es gibt keinen Serveraufruf, nichts wird geloggt, und es gibt kein Konto. Das zählt hier mehr als auf den meisten Seiten: Ein JWT aus einer aktiven Session ist bis zum Ablauf ein funktionierender Zugang. Einen davon in eine Website einzufügen ist also eher, als würdest du ein Passwort einfügen, als eine Config-Datei.
- Warum prüft das Tool die Signatur nicht?
- Weil du dafür den Key herausgeben müsstest. Bei HS256 ist das dein Signing Secret, und ein JWT Validator, der dich bittet, ein Signing Secret aus der Produktion in ein Textfeld im Internet einzufügen, verlangt etwas Schlimmeres als das Problem, das er löst. Bei RS256 bräuchtest du den Public Key des Ausstellers, und der verrät dir nur, dass der Token von dem signiert wurde, der den Private Key hat – das prüft dein eigenes Backend ohnehin bei jedem Request. Alles, was diese Seite anzeigt, lässt sich ohne beides feststellen.
- Ist der Payload verschlüsselt?
- Nein, und das ist das häufigste Missverständnis über JWTs überhaupt. Der Payload ist base64url, keine Verschlüsselung – eine Signatur verhindert, dass er verändert wird, nicht, dass er gelesen wird. Alle, die den Token haben, sehen jeden Claim: deine eigenen Kund:innen, jeder Proxy auf dem Weg und alles, was einen Authorization-Header loggt. Deshalb listet dieser JWT Decoder jeden Claim auf, dessen Name nach personenbezogenen Daten aussieht – denn diese Daten sind für alle, die der Token erreicht, praktisch öffentlich.
- Mein Token ist gültig, aber die API lehnt ihn ab. Was jetzt?
- In der Reihenfolge, in der es tatsächlich passiert: Der Token ist zwischen Ausstellung und Nutzung abgelaufen; nbf liegt in der Zukunft, weil die Uhr des ausstellenden Servers der prüfenden Seite voraus ist; der aud-Claim nennt einen anderen Service; iss passt nicht zu dem, was die prüfende Seite erwartet; oder es ist ein ID-Token, der dort ankommt, wo ein Access-Token erwartet wird. Das Panel zeigt alle fünf – deshalb taugt es als JWT Debugger mehr als ein reines Dekodieren.
- Was bedeutet alg: none?
- Dass der Token nicht signiert ist. Eine Library, die den Algorithmus aus dem Token liest, statt den erwarteten festzulegen, akzeptiert bereitwillig einen Payload, den jemand bearbeitet hat – der Angriff aus CVE-2015-9235, der immer noch in echtem Code ausgeliefert wird. Deshalb wird er als Gefahr markiert. Wenn du ihn bei einem Token aus einem Produktivsystem siehst, ist nicht der Token das Problem.
- Warum warnt es vor jku und x5u im Header?
- Diese Header-Parameter sagen der prüfenden Seite, wo sie den Key abholen soll. Folgt sie der URL ohne Allowlist, kontrolliert, wer den Token kontrolliert, auch den Key – und damit die Signatur. Ein jwk im Header ist dasselbe Problem in einem kürzeren Loop: Der Token liefert den Key mit, mit dem der Token geprüft wird.
- Was ist der Unterschied zwischen einem ID-Token und einem Access-Token?
- Ein ID-Token beschreibt, wer die Person ist, und ist für deine Anwendung gedacht. Ein Access-Token autorisiert einen Aufruf und ist für eine API gedacht. Beide sehen gleich aus, deshalb ist es ein so häufiger Bug, den falschen zu schicken – der token_use-Claim von Cognito existiert genau dafür, sie zu unterscheiden, und ein JWT Validator auf API-Seite sollte ihn prüfen.
- Kann es mir sagen, welcher Anbieter den Token ausgestellt hat?
- Ja, über den iss-Claim. Auth0, AWS Cognito, Firebase, Keycloak, Okta, Supabase, Microsoft Entra ID, Clerk, Stytch und WorkOS werden an ihren Issuer-URLs erkannt. Eine Kleinigkeit, aber nützlich, wenn ein Token aus einem System kommt, das du nicht selbst eingerichtet hast.
- Funktioniert es als JWT Token Decoder für Tokens aus einem Header oder einer Logzeile?
- Ja. Ein vorangestelltes Bearer wird automatisch entfernt, Leerzeichen drumherum werden ignoriert. Als JWT Token Decoder verarbeitet es außerdem base64url korrekt – die Bindestriche und Unterstriche, die in den meisten echten Signaturen vorkommen und an denen Decoder auf Basis von reinem Base64 stillschweigend scheitern.
- Warum warnt es vor der Token-Größe?
- Weil Browser ein einzelnes Cookie auf etwa 4 KB begrenzen, und mehrere Proxys und Server begrenzen Request-Header standardmäßig ebenfalls. Ein Token, der über diese Grenze wächst, scheitert auf eine Art, die wie ein Auth-Bug aussieht und keiner ist. Große Arrays mit Rollen oder Berechtigungen sind fast immer die Ursache.
- Warum warnt es vor langen Lebensdauern?
- Ein Bearer-Token ist gültig, bis er abläuft, und dazwischen fragt nichts beim Aussteller nach. Ein geleakter Token mit dreißig Tagen Lebensdauer ist also ein Problem für dreißig Tage, solange du keine Denylist pflegst. Kurze Access-Tokens plus ein Refresh-Token gibt es, um dieses Zeitfenster klein zu halten.
- Was, wenn ich etwas einfüge, das kein JWT ist?
- Dann erfährst du, was es ist. Fünf Segmente bedeuten ein JWE – verschlüsselt und ohne Key nicht lesbar. Ein einzelner opaker String ist eine Session-ID, kein Token mit Inhalt. Zwei Segmente heißen meist, dass die Signatur beim Kopieren abgeschnitten wurde. „Ungültiger Token“ würde dich auf die Suche nach einem Tippfehler schicken, den es nicht gibt.
- Gibt es einen JWT Decoder für abgelaufene Tokens?
- Diesen hier. Der Ablauf ist ein Claim im Payload, keine Eigenschaft der Kodierung, ein abgelaufener Token lässt sich also genauso dekodieren wie ein gültiger – der Unterschied ist nur, dass die prüfende Seite ihn ablehnt. Einen abgelaufenen Token lesen zu können ist meist genau der Grund, einen Decoder zu öffnen.
- Warum ist das kostenlos, und was ist Tekk?
- Mit Tekk wird dein Produkt zu Software, die sich selbst verbessert: 16 Loops beobachten deine Codebase und bringen dir Proposals, die du mit Greenlight freigibst oder ablehnst, und dein Coding-Agent baut das Ergebnis. Diese Seite kostet im Betrieb nichts, weil nichts auf unseren Servern läuft – deshalb gibt es keine Anmeldepflicht, kein Limit und keinen Upsell im Tool.
Willst du eine echte Spec für das, was du baust?
Schreib einen Satz. Tekk liest deinen Code und schreibt die Spec, die dein Coding-Agent baut – und seine Loops behalten im Blick, was du auslieferst.
Kostenlos testen · GitHub bei der Registrierung verbinden