zerouploads

JWT Decoder

Decode a JSON Web Token into its header, payload and claims, with expiry checked and HMAC signatures verified in the page.

  • Preview
  • Unlimited
  • No signup
  • Private
  • Works offline

Decode a JSON Web Token

HS2563 segments · 228 characters

header · payload · signatureURL-safe Base64, unpadded

Header

{ "alg": "HS256", "typ": "JWT" }

Payload

{ "sub": "user_8421", "name": "Jane Doe", "plan": "team", "scope": [ "read", "write" ], "iat": 1788098400, "exp": 1788102000 }

 

Signature not checked. Paste the secret below to check it

Every claim in the payload, with what it means
ClaimValueMeaningCopy
subuser_8421Subject · who the token is about
nameJane DoeCustom claim
planteamCustom claim
scoperead, writeCustom claim
iat1788098400Issued 30 Aug 2026, 14:00:00 UTC
exp1788102000Expires 30 Aug 2026, 15:00:00 UTC
decoded in this tab · the secret is used here and never stored

What the three segments hold

A JWT is three pieces of URL-safe Base64 joined by dots. The header names the signing algorithm. The payload carries the claims. The signature is computed from the first two.

Only the signature is cryptographic. The header and payload are encoded, not encrypted, so anyone holding the token can read every claim in it. Never put anything in a payload that you would not want a stranger to read.

Some claim names have fixed meanings. sub is who the token is about, iss is who made it, and aud is who it is for. The window it is good for comes from iat, nbf and exp. Those three are Unix timestamps, so this page turns them into dates and says whether the token has gone stale.

Algorithms
HS256, HS384 and HS512 are checked right here. RS and ES tokens decode, but need a public key.
Expiry
exp, nbf and iat are turned into UTC dates, with how long ago or how long to go.
Secret handling
A secret you paste is used for the check and then dropped. It is never stored or sent.
Malformed tokens
A wrong segment count, bad Base64 or broken JSON is named, with the character at fault.

Verification matters more than decoding

Decoding tells you what a token claims. Verifying tells you whether to believe it. A token whose signature has not been checked is just input from a stranger.

The classic mistake is letting the token pick its own algorithm. That means accepting alg: none, or reading the algorithm out of the header and trusting it. On a server, pin the algorithm and the key you expect and ignore what the header says.

Frequently asked questions

Is my token sent anywhere?
No. Decoding and the signature check both run in this page, and the secret you paste is held in memory for the check and then dropped. A real token should never go into a site that sends it somewhere.
Is a JWT encrypted?
No. It is encoded, which is not the same thing. Anyone with the token can read the payload, exactly as this page does. Treat one as readable by whoever holds it.
Why does the signature check need a secret?
Because the signature is made with it. Without the secret there is nothing to check against, and a token whose signature you cannot check is untrusted input.
Can it verify RS256?
No. RS and ES tokens are signed with a private key, so checking one needs the matching public key. The header, payload and expiry all still decode.
What does exp mean?
The second the token stops being valid, counted in seconds from 1 January 1970. The page prints it as a UTC date and says how long ago it passed, or how long is left.
Can I edit and re-sign a token?
No. Signing needs your real secret, and you should not trust a page that offers to hold it. Sign tokens in your own code.
What is alg: none?
A token that says it is unsigned. Some old libraries accepted them, which meant anyone could write any claims they liked. If you see it, the page says so plainly.
Browse all developer tools