What This Tool Does
This tool decodes a JSON Web Token (JWT) so you can read its header and payload without needing any key, and optionally verifies its signature if you supply the matching secret or public key. Paste a token, and you immediately see the decoded header, the claims inside the payload, and badges for whether it's expired or not yet valid — all computed from your device's own clock.
Everything runs locally through WebAssembly. There's no server involved in decoding or verifying, which matters because a JWT often carries session or identity data you wouldn't want passing through a third party's backend just to inspect it.
Anatomy of a Token
A JWT is three base64url-encoded segments joined by dots: header, payload, and signature — written as header.payload.signature. The header names the signing algorithm and token type; the payload holds the claims (things like the subject, an expiration time, or custom application data); the signature is the part that a verifier checks to confirm the first two segments haven't been altered.
// Decoded payload, for example
{
"sub": "1234567890",
"name": "Ada Lovelace",
"exp": 1735689600
}
Decoding vs Verifying
These are separate steps, and the distinction matters. Decoding turns the base64url header and payload back into readable JSON — no key needed, and it works on any well-formed token, genuine or forged. Verifying recomputes the signature using a secret (HS256) or checks it against a public key (RS256, ES256) and confirms it matches what's attached to the token. Only a passing verification tells you the token was actually issued by whoever holds that key and hasn't been tampered with since.
Choosing an Algorithm
| Algorithm | Key type | How verification works |
|---|---|---|
| HS256 | Shared secret (HMAC) | The same secret that signed the token is used to recompute the signature — both issuer and verifier must hold it |
| RS256 | RSA key pair | The issuer signs with a private key; you verify with the corresponding public key, which is safe to share |
| ES256 | Elliptic-curve key pair (P-256) | Same public/private split as RS256, using ECDSA over the P-256 curve for a smaller signature |
Use whichever algorithm the token was actually issued with — verification only succeeds against the correct key for that specific algorithm, not any key you happen to have.
Why alg: none Is Rejected
A small number of JWT libraries have historically treated the none algorithm as "valid, no signature required," which means anyone can construct a token with any claims they like and have it accepted as genuine — a well-documented class of real-world JWT vulnerabilities. This tool always treats alg: none as a failed verification rather than a pass, so pasting an unsigned token here never produces a misleading "valid" result.
Your Token Never Leaves Your Device
The token text, along with any secret or public key you enter to verify it, is processed entirely inside a WebAssembly module running in your browser tab. Nothing is uploaded, logged, or sent to a server — closing the tab clears everything, since there was never a network request carrying your token in the first place.
If you also need to set up two-factor authentication, see the TOTP generator & setup. If you need a fresh key pair to sign tokens with RS256 or ES256 elsewhere, see the Key pair generator — both run on-device the same way this tool does.