JWT Decoder
Read any token's claims, and check an HMAC signature against your secret.
Runs entirely in your browser
Loading the tool…
- —Algorithm
- —Type
- —Expires
- —Signature
Registered claims
Verify the signature
A JWT is three base64url segments separated by dots: a header saying how it was signed, a payload of claims, and a signature over the first two. Paste one and you get the header and payload as formatted JSON, the registered claims explained, and the answer to the question that usually prompted the visit: whether it has expired.
Decoding is not verifying. The payload is encoded, not encrypted; anyone holding the token can read it, including this page. A token is only trustworthy once its signature has been checked against the signing key. If it is signed with HS256, HS384 or HS512 you can do that here by entering the shared secret. RS, PS and ES tokens are signed with a private key and need the issuer's public key, which is a different job.
Everything happens inside this page. Tokens routinely carry live credentials, so that matters more here than on most tools. The page has no server to send yours to, and you can confirm it by disconnecting the network and watching it still work.
How to use it
- Paste the token. A Bearer prefix, quotes or line wrapping are all fine.
- Read the header, payload and claims, and check the expiry.
- For an HS256/384/512 token, enter the shared secret and press Check.
Questions
Is it safe to paste a token into a website?
Into most, no. A token is usually a live credential, and a server-side decoder receives it in full. This one runs entirely in your browser with no network code, which you can verify by going offline and trying it. Treat any token you have pasted elsewhere as compromised and rotate it.
What is the difference between decoding and verifying?
Decoding just base64-decodes the segments, which anyone can do. Verifying recomputes the signature with the key and compares it, which is what proves the token came from the issuer and has not been altered. An unverified payload should never be trusted.
Why can't it verify my RS256 token?
RS256, PS256 and ES256 sign with a private key and verify with the matching public key, so there is no shared secret to type in. Only the HMAC family (HS256, HS384, HS512) uses one key for both, and those are the ones this page can check.
What does alg "none" mean?
It means the token is unsigned. The header field is attacker-controlled, so a server that trusts it will accept a forged token. This was a widespread vulnerability in JWT libraries. Any token arriving with alg none should be rejected outright, and the page flags it.
My token says it expired but the server still accepts it.
exp is advisory: it only takes effect if the server checks it. Clock skew between machines also shifts the boundary by a few seconds either way.
Your data stays on your device
Everything above runs inside your browser as WebAssembly compiled from Rust. Nothing you type is uploaded, logged or stored on a server. There is no server. You can load this page once, go offline, and it still works.