Skip to content

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
Your token stays in this tab
This page is static HTML and JavaScript with no network code at all. Decoding and signature verification both run in your browser, so a production access token never crosses the wire.
JSON Web Token
Paste the token, with or without a “Bearer ” prefix.

How to decode a JWT

  1. Paste the token — a Bearer prefix is stripped automatically.
  2. The header and payload are decoded from Base64url and pretty-printed as JSON.
  3. The claims table annotates every registered claim and converts exp, iat and nbf into local times with a relative distance from now.
  4. 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

PartContentsProtected?
HeaderThe signing algorithm (alg), type (typ) and often a key id (kid)Covered by the signature, but readable by anyone
PayloadThe claims: who the token is about, who issued it, when it expiresCovered by the signature, but readable by anyone
SignatureAn HMAC or a digital signature over header.payloadThis 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

ClaimNameMeaning
issIssuerWho minted the token. Verifiers should check this matches an expected value.
subSubjectThe principal, usually a stable user identifier.
audAudienceWho the token is for. A service must reject tokens issued for a different audience.
expExpirationSeconds since 1970-01-01 UTC. Reject at or after this instant.
nbfNot beforeReject before this instant.
iatIssued atWhen it was created — useful for detecting a stale session.
jtiJWT IDA unique id, so a token can be blacklisted or replay-detected.

Signature algorithms

FamilyExamplesKeyVerifiable here
HMACHS256, HS384, HS512One shared secret, held by both issuer and verifierYes
RSARS256, PS256Private key signs, public key verifiesNo — needs the issuer public key
ECDSAES256, ES384Private key signs, public key verifiesNo — needs the issuer public key
Nonealg: noneNo signature at allFlagged 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.