Decode Your JWT in 10 Seconds
A JWT decoder takes the long dot-separated string your API hands out after login and splits it into readable JSON — that is all a jwt token decode does. No secret key needed, no code to write. Here is the whole workflow:
- Copy the token. Grab it from the
Authorizationheader in your browser's network tab, a cookie,localStorage, or the login API response. Copying theBearerprefix along with it is fine. - Paste it into a free JWT decoder. The token is split into its three parts — header, payload, signature — and the first two are decoded from Base64URL into readable JSON instantly.
- Read the header. Check
alg(the signing algorithm) andtyp. Ifalgsaysnone, stop: that token has no signature at all. - Read the payload claims. Who issued the token (
iss), who it is for (sub,aud), when it expires (exp), and your app's custom claims like roles. - Check the expiry status. A good decoder converts the Unix timestamps to human-readable times and tells you outright whether the token is expired or not yet valid.
What to Check in a Decoded Token: a 5-Point Checklist
Decoding is usually step one of debugging an auth problem. Run through these five checks before you touch any code:
exp— is it expired? The most common auth failure. Timestamps are in seconds, not milliseconds; a 13-digit value is a bug, not a far-future expiry.alg— is it what you expect? Your API should pin one algorithm.noneor an unexpected value is a red flag, not a quirk.issandaud— right issuer, right audience? A staging token sent to production, or a token minted for one API reused on another, fails here.sub— the right user? Confirm the subject matches the account you are testing with, especially after login-as or impersonation flows.- Custom claims — are the roles and scopes present? A 403 with a valid token almost always means a missing or misspelled claim, not a broken decoder.
For the full reference of every registered claim and what your server should do with each, the JWT decoder tool page has a complete claims table.
Free JWT Decoders Compared
jwt.io is the best-known decoder and the default bookmark for most developers. But it is not the only option, and for quick debugging the differences matter:
| jwt.io | FrostRank JWT decoder | Typical server-side decoders | |
|---|---|---|---|
| Price / signup | Free, no signup | Free, no signup | Free, no signup |
| Token leaves your browser | No for decode; verification sends data to its backend | Never — 100% client-side | Yes — the token is uploaded to decode |
| Expiry countdown | Shows timestamps | Human-readable times + expired/not-yet-valid status | Varies |
| Registered claims explained | Raw JSON | Claims table with plain-English meanings | Raw JSON |
alg: none warning |
No | Yes — red warning | Rarely |
| Signature verification | Yes, with your secret | No (by design — verification belongs server-side) | Sometimes |
| Best for | Quick decodes + signature checks | Private, fast debugging of claims and expiry | One-off pastes |
Why Client-Side Decoding Matters
A JWT is a bearer credential: anyone holding a live token can use it until it expires. Pasting a production token into a decoder that uploads it to a server is, functionally, sharing that credential with a third party — even if the site promises not to store it.
A decoder that runs entirely in your browser never sends the token anywhere: no upload, no logging, nothing to leak. You can verify this yourself in DevTools' network tab — decode a token and watch for zero outbound requests. For production tokens, that is the only kind of decoder worth using. Test-environment or already-expired tokens are the safe choice anywhere else.
Decoding Is Not Verifying
Think of them as two different questions. Decoding answers “what does this token say?” — it turns the encoded text back into JSON with no key, and tells you nothing about whether to trust it. Verifying answers “should I believe it?” — your API re-signs the header and payload with its secret (or checks the public key) and compares. Only a verified token's claims are safe to act on.
A decoded payload is only trustworthy after your API verifies it, on every request, with a maintained JWT library. An online decoder is a debugging lens, not a security check. The decoder deliberately does not verify signatures: any page that asks you to paste a signing secret is teaching a bad habit.
Frequently Asked Questions
How do I decode a JWT token?
Copy the full token (header.payload.signature) and paste it into a jwt token decode tool, then read the decoded header and payload as JSON. No secret key is needed — the header and payload are only encoded, not encrypted. The free JWT decoder does this in your browser with no signup.
Can I decode a JWT without the secret key?
Yes — and that surprises people. The signature is the only part that needs a key; the header and payload are just encoded text, readable by design. Treat every claim as public: if you would not print it in a server log, it does not belong in a JWT.
Is it safe to paste my JWT into an online decoder?
Only if the decoder runs entirely client-side, so the token never leaves your browser. Server-side decoders receive your token over the network. Even with a client-side decoder, prefer test-environment tokens or expired ones for production debugging.
Why does my token show as expired?
Its exp moment has passed. When a fresh token already looks dead, suspect clock drift between the issuing and verifying servers first — a few minutes of disagreement is enough — or a milliseconds timestamp being misread as seconds.
What is the difference between jwt.io and FrostRank's JWT decoder?
Both decode tokens free with no signup. jwt.io also verifies signatures if you provide the secret (which sends data to its backend). FrostRank's decoder is 100% client-side — the token never leaves your browser — and adds human-readable expiry times, a plain-English claims table, and an alg: none warning.
Comments
No comments yet. Be the first to share your thoughts below.