JWT Decoder

Paste a JSON Web Token to read its header and payload, see when it was issued and when it expires, and verify the signature with your secret or public key.

Updated
Decoded in your browser. The token is not uploaded.
Decodes as you paste.

How to use the JWT Decoder

  1. Paste the token into JSON Web Token. It usually starts with eyJ.
  2. Read the decoded Header, Payload, and the Claims table, which turns timestamps into dates and tells you whether the token has expired.
  3. To check the signature, paste the shared secret or the PEM public key into Verify signature and press Verify.

How it works

A signed JWT has three parts separated by dots: header.payload.signature. The header and payload are JSON encoded as Base64URL, which is Base64 with - and _ instead of + and /, and no padding.

  • Decoding reverses the Base64URL step and parses the JSON. No key is needed, because a JWT is signed, not encrypted.
  • Verifying recomputes the signature over header.payload with the algorithm named in the header's alg field and compares it with the third part.
  • HMAC algorithms (HS) use a shared secret. RSA (RS, PS) and ECDSA (ES) algorithms use a public key in PEM format. The check runs in the browser with the Web Crypto API.
  • exp, iat, and nbf are Unix timestamps in seconds.

Examples

This token is signed with HS256 and the secret utilza-demo-secret:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSBMb3ZlbGFjZSIsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxODkzNDU2MDAwfQ.mfJNFTnleCo-uVQHqKxK0ESsxp9RmZ1Y1gInltzAfwM
  • Header: {"alg":"HS256","typ":"JWT"}
  • Payload: {"sub":"1234567890","name":"Ada Lovelace","iat":1767225600,"exp":1893456000}
  • iat 1767225600 is 2026-01-01 00:00:00 UTC, and exp 1893456000 is 2030-01-01 00:00:00 UTC.
  • Verifying with utilza-demo-secret gives Signature verified. Any other secret gives Invalid signature.

Registered JWT claims

ClaimNameMeaning
issIssuerWho created and signed the token
subSubjectWho the token is about, usually a user ID
audAudienceWhich service the token is meant for
expExpiration timeAfter this moment the token must be rejected
nbfNot beforeBefore this moment the token must be rejected
iatIssued atWhen the token was created
jtiJWT IDA unique ID, used to stop a token being replayed

Limitations

  • Encrypted tokens (JWE, five parts) can't be decoded here, because their payload needs the private key.
  • Verification needs a PEM public key or a secret. JWKS URLs and certificates in x5c are not fetched.
  • EdDSA (Ed25519) signatures depend on browser support and may not verify in older browsers.
  • A valid signature proves who signed the token. Your server still has to check exp, aud, and iss.

Frequently asked questions

Is it safe to paste a JWT here?

The token is decoded and verified in your browser and is never sent to a server. Even so, treat live production tokens like passwords and prefer test tokens when you can.

Can anyone read the contents of a JWT?

Yes. The header and payload are only Base64URL encoded, not encrypted. Never put passwords or other secrets in a JWT payload.

Why does my token show as expired?

The exp claim is earlier than your device's clock. Tokens are short-lived on purpose, so get a new one from the issuer.

What is the difference between HS256 and RS256?

HS256 signs with one shared secret that both the issuer and the checker must know. RS256 signs with a private key and is checked with the matching public key, so the checker never holds the signing key.

Why does verification fail with the right secret?

Check whether the secret is stored as Base64. Some systems use the decoded bytes of a Base64 secret. Tick Secret is Base64 encoded and try again.

Often used together with the JWT Decoder.