JWT decoder
This tool splits any JSON Web Token into its header, payload claims, and raw signature, decoding the readable parts so you can inspect exactly what a token contains. It’s for developers debugging auth flows, checking why a token is rejected, or confirming which claims and expiry an identity provider issued — all without a network request.
How it works
A JWT is three Base64URL-encoded segments joined by dots. The tool splits on .,
then decodes the first two segments with a Base64URL-safe atob (it first swaps
-/_ back to +// and restores padding), and runs JSON.parse on the
result to show the header and payload as key-value pairs. The signature is shown
raw. When “Decode timestamps” is on, numeric time claims (exp, iat, nbf,
auth_time, updated_at) are read as Unix seconds and converted with
new Date(value * 1000) to a readable UTC string. An exp earlier than the
current time is highlighted in red as expired.
Example
The token below (HS256, demo only):
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJleHAiOjE3MDAwMDAwMDB9.sig
decodes to a header of {"alg":"HS256","typ":"JWT"} and a payload of
{"sub":"123","exp":1700000000}. With timestamps on, exp: 1700000000 shows as
2023-11-14 22:13:20 UTC and is flagged expired.
What the tool does and does not do
| Action | Supported |
|---|---|
| Decode header (alg, typ) | Yes |
| Decode payload claims | Yes |
| Convert exp / iat / nbf to dates | Yes |
| Flag expired tokens | Yes |
| Verify the signature | No (needs the server-side secret/public key) |
Decoding happens entirely in your browser, so this is safe to use with real tokens — your token never leaves your device.