· 4 min read
How to Decode a JWT Without a Backend
Heshan Fernando
Co-founder & COO
You’re debugging an authentication issue and need to see what’s actually inside a JWT — which claims it carries, whether it’s expired, what the header specifies — without writing a throwaway script or spinning up a backend just to call a decoding library. A JWT looks like an opaque blob of characters at a glance, but its header and payload are just base64url-encoded JSON, readable the moment you decode those two segments.
This trips people up who assume decoding requires the signing secret. It doesn’t — decoding just reveals the readable content; verifying the signature (confirming the token is legitimate and untampered) is a separate step that does require the secret or public key.
What decoding a JWT actually reveals
A JWT is three base64url-encoded segments separated by dots: a header (specifying the signing algorithm and token type), a payload (the actual claims — things like user ID, issued-at time, and expiry), and a signature (which validates the token’s integrity but isn’t itself decoded into readable content). Decoding the header and payload just reverses the base64url encoding back into readable JSON — no cryptographic operation, no secret required.
Checking expiry is a common reason to decode a JWT during debugging: the payload’s exp claim, if present, is a Unix timestamp, and comparing it to the current time tells you whether the token has expired — a frequent, simple explanation for an authentication failure that’s otherwise easy to misdiagnose as something more complicated.
Why people get stuck here
- Decoding and verifying are commonly conflated. Decoding reveals the readable header and payload content; verifying confirms the signature is valid using the secret or public key — they’re separate operations, and only one of them requires anything beyond the token itself.
- The
expclaim’s Unix timestamp format isn’t immediately readable. Without converting it, it’s not obvious at a glance whether a token has actually expired, which can make an expiry-related bug look more mysterious than it is. - Pasting a token into an unfamiliar third-party site raises legitimate privacy concerns. A JWT can carry sensitive claims, and decoding it somewhere that might log or transmit that content is a real concern during debugging with real tokens.
- Malformed tokens produce confusing errors without a clear tool. A JWT that’s missing a segment or has invalid base64url encoding needs to fail clearly, not silently produce garbage output.
What a good JWT decoder looks like
Decodes the header and payload as readable JSON
Presenting both segments in clear, formatted JSON makes it immediately obvious what claims and algorithm the token carries.
Shows expiry status clearly, if present
Converting the exp claim’s Unix timestamp into a clear expired/not-expired status saves the manual conversion step during a debugging session.
Processes entirely in your browser
For tokens that may carry sensitive claims from a real system, decoding locally rather than sending the token to a remote server matters during debugging with production-adjacent tokens.
Common mistakes to avoid
- Assuming a JWT decoder also verifies the signature, when decoding only reveals readable content — verification is a separate step requiring the signing secret or public key.
- Pasting a real, sensitive token into an unfamiliar third-party tool without checking whether it processes locally or sends the token to a server.
- Misreading the
expclaim’s raw Unix timestamp without converting it, leading to confusion about whether a token has actually expired. - Assuming a malformed or garbled decode result means the token itself is broken, when it might just be an incomplete paste (a missing segment) of an otherwise valid JWT.
How to do it with JWT Decoder
Online Tool Store’s JWT Decoder decodes a JWT’s header and payload as readable JSON, with expiry status shown if present, entirely in your browser.
- Paste your JWT.
- Review the decoded header and payload as formatted JSON.
- Check the expiry status if the
expclaim is present. - Use the readable content to debug the authentication issue at hand.
Because it processes entirely in your browser, you can decode real tokens during debugging without sending them to a remote server.
Frequently asked questions
Does decoding a JWT verify that it’s legitimate?
No — decoding only reveals the readable header and payload content by reversing the base64url encoding. Verifying the token’s signature (confirming it’s legitimate and untampered) is a separate operation requiring the signing secret or public key.
Why does my token look expired even though the app says it’s still valid?
Check the exp claim’s Unix timestamp against the current time carefully — a small clock skew or timezone confusion during manual comparison is a common source of this kind of mismatch.
Is it safe to decode a real production JWT in a browser-based tool?
As long as the tool processes the token entirely client-side without sending it to a server, decoding is just a local, readable transformation of content the token already carries — but it’s worth confirming that’s how a given tool actually works before pasting a sensitive token.
Final thought
Decoding a JWT is just reversing base64url encoding back into readable JSON — no secret, no backend required. Keep decoding and verifying conceptually separate, and you’ll debug authentication issues faster.