How to use
Paste a JWT — three base64url segments joined by dots — and the header and payload appear as formatted JSON. If the payload has an "exp" claim, the expiry date shows next to the payload pane, with a red "expired" badge once that timestamp is past.
This is a debugging viewer, not a verifier. The signature segment is read for presence but never checked against a key, so a tampered token decodes just fine. Use it to inspect what a backend or identity provider (Auth0, Cognito, Firebase, Keycloak) actually put inside a token while you build or troubleshoot — then validate signatures server-side with a proper library.
FAQ
Does this tool verify the JWT signature?
No. Signature verification needs the issuer's secret or public key, which a generic web tool cannot have. This decoder shows only what the header and payload contain. For verification use a server-side library (jsonwebtoken, jose, PyJWT, etc.) with the correct key.
Is my token sent to a server?
No. The decode runs entirely in your browser via atob and TextDecoder. The token never leaves the page. Even so, treat production tokens with care — pasting them into any tool is one more place they could leak via clipboard history or screenshots.
Which JWT algorithms are supported?
All of them, because the decoder ignores the algorithm. HS256, RS256, ES256, EdDSA — the header and payload are just base64url-encoded JSON regardless of how the signature was produced. The algorithm only matters when verifying.
Can I decode a JWE (encrypted token)?
No. JWE has five segments, not three, and the payload is encrypted rather than base64-encoded JSON. You need the decryption key plus a JOSE library. Most "JWTs" in the wild are actually JWS (signed, not encrypted), which this tool handles.
Why does the expiry show a different date than I expected?
JWT exp is Unix seconds in UTC, not milliseconds and not the local timezone. The badge displays the UTC date. If your server uses milliseconds (a non-standard but common mistake), the year will read 1970 — that's the signal to fix the issuer.
Related concepts
A JWT is three base64url-encoded segments — header, payload, signature — joined by dots. The header announces the signing algorithm (alg) and token type. The payload is a JSON object of "claims": registered ones like iss (issuer), sub (subject), aud (audience), exp (expiry), iat (issued-at), and any custom claims the issuer adds. The signature is computed over header + payload using the algorithm declared in the header.
Base64url differs from regular base64 in two characters (- and _ instead of + and /) and omits padding, which is why pasting a JWT into a normal base64 decoder usually fails. JWTs are not encrypted — anyone holding the token can read everything inside. Never put secrets in a payload; the signature only guarantees the payload was not modified, not that it is private. For encryption, the JOSE family defines JWE, which this tool does not decode.