JWT decoder and HS256 verifier
Decode a JSON Web Token header, payload and signature, read the claims in plain English, and verify HS256/384/512 — the token never leaves your browser.
- Runs in your browser
- Nothing you enter is sent
- Free, no account
How to decode a JWT
- Paste the token — a
Bearerprefix is stripped automatically. - The header and payload are decoded from Base64url and pretty-printed as JSON.
- The claims table annotates every registered claim and converts
exp,iatandnbfinto local times with a relative distance from now. - If the token uses HS256, HS384 or HS512, paste the shared secret and press Verify to check the signature with WebCrypto.
Why decoding a token here is safe
Most JWT debuggers are server-rendered web applications. Even when they promise not to log anything, the token reaches their infrastructure — TLS terminators, load balancer access logs, error trackers and whatever else sits in the request path. Pasting a production access token into one is, strictly speaking, a credential disclosure.
This page is a static file. There is no API, no analytics script and no fetch call anywhere in its JavaScript. The token is parsed by your browser, the signature is verified by your browser's WebCrypto implementation, and both disappear when you close the tab. You can disconnect from the network and the page keeps working — which is the easiest way to prove the claim to yourself.
The three parts of a JWT
| Part | Contents | Protected? |
|---|---|---|
| Header | The signing algorithm (alg), type (typ) and often a key id (kid) | Covered by the signature, but readable by anyone |
| Payload | The claims: who the token is about, who issued it, when it expires | Covered by the signature, but readable by anyone |
| Signature | An HMAC or a digital signature over header.payload | This is the only part that proves anything |
All three are joined with dots and encoded with Base64url — not encryption. Never put anything in a JWT payload that the holder of the token should not be allowed to read.
Registered claims worth knowing
| Claim | Name | Meaning |
|---|---|---|
iss | Issuer | Who minted the token. Verifiers should check this matches an expected value. |
sub | Subject | The principal, usually a stable user identifier. |
aud | Audience | Who the token is for. A service must reject tokens issued for a different audience. |
exp | Expiration | Seconds since 1970-01-01 UTC. Reject at or after this instant. |
nbf | Not before | Reject before this instant. |
iat | Issued at | When it was created — useful for detecting a stale session. |
jti | JWT ID | A unique id, so a token can be blacklisted or replay-detected. |
Signature algorithms
| Family | Examples | Key | Verifiable here |
|---|---|---|---|
| HMAC | HS256, HS384, HS512 | One shared secret, held by both issuer and verifier | Yes |
| RSA | RS256, PS256 | Private key signs, public key verifies | No — needs the issuer public key |
| ECDSA | ES256, ES384 | Private key signs, public key verifies | No — needs the issuer public key |
| None | alg: none | No signature at all | Flagged as unsigned |
A verifier that trusts the alg field from the token itself can be tricked into accepting
alg: none, or into verifying an RS256 token as HS256 using the public key as the HMAC
secret. Always pin the expected algorithm in your verification code rather than reading it from the
token.
Debugging an "expired" token
When a token looks valid but the server rejects it, work through this list: is your device clock
correct; does the aud claim match the service you are calling; is the iss the
issuer that service trusts; is the kid a key the service still has; and has the token been
revoked server-side (a JWT cannot be un-issued, so revocation always lives outside the token). The
claims table on this page answers the first four in one glance.
Questions
Is it safe to paste a real access token here?
Safer than anywhere that runs a server. This page is static, has no network code at all, and the decoding happens in your tab. Even so, treat any token you paste into any tool as one you should be prepared to rotate.
Does decoding a JWT prove it is valid?
No. Anyone can read a JWT payload because it is only Base64url, not encryption. Validity means the signature checks out against the issuer key and the time claims are in range — both of which this tool shows separately.
Which algorithms can be verified here?
The HMAC family — HS256, HS384 and HS512 — using WebCrypto and a shared secret you supply. RS/ES/PS algorithms need the issuer public key and asymmetric key parsing, which is out of scope for this page.
What do exp, iat and nbf mean?
They are NumericDate claims counted in seconds since 1970-01-01 UTC: iat is when the token was issued, nbf the earliest moment it may be accepted, and exp the moment it stops being valid. Each is shown as a local time and a relative distance from now.
Why does my token show as expired when the server accepts it?
Usually clock skew. Most verifiers allow a small leeway, often 30 to 60 seconds, around exp and nbf. Check that your own device clock is correct before assuming the token is the problem.