About the JWT Decoder & Verifier
A JSON Web Token (JWT) is a compact string of three base64url parts separated by dots: a header that names the signing algorithm, a payload with claims such as the user ID and expiry time, and a signature. Anyone can decode the first two parts – they are encoded, not encrypted – but only the signature tells you whether the token was really issued by someone who holds the key.
This tool decodes the header and payload, turns the exp, nbf and iat timestamps into readable dates and tells you whether the token has expired. If you paste the signing secret or the issuer’s public key, it also verifies the signature. Tokens and keys are processed in your browser and are never sent to a server, which matters because access tokens grant access to real accounts.
How to use it
- Paste the token into the Token box. A leading "Bearer " and line breaks are removed automatically.
- Read the decoded Header and Payload, and check the Claims table for the issuer, subject, audience and validity period.
- To check the signature, go to "Verify signature". For HS256, HS384 or HS512 enter the shared secret; tick "Secret is base64-encoded" if it is.
- For RS, PS, ES or EdDSA tokens paste the public key as a PEM block, an X.509 certificate, a JWK or a whole JWKS.
- Click Verify. The result shows whether the signature is valid.
Features
- Readable claims: Expiry, not-before and issued-at times are shown in UTC, in your time zone and relative to now, with a live status.
- Signature verification: Supports HS256/384/512, RS256/384/512, PS256/384/512, ES256/384/512 and EdDSA (Ed25519) using your browser’s Web Crypto API.
- Flexible key input: Accepts SPKI PEM public keys, X.509 certificates, single JWKs and JWK sets, where the key is picked by its kid.
- Clear error messages: Tells you whether a token has the wrong number of parts, invalid base64url or invalid JSON, or is an encrypted JWE.
- Private by design: Nothing is uploaded or stored. Keys stay in this browser tab and are gone when you close it.
Examples
Why does the API return 401?
Paste the access token from the failing request. The Claims table shows "Expired" and the expiry time in your time zone, so you know the client did not refresh the token.
Checking an ID token from an identity provider
Copy the provider’s JWKS document (from its jwks_uri) and paste it as the key. The tool selects the key with the matching kid and verifies the RS256 signature.
Debugging an HS256 integration
Paste a token and your shared secret. If the signature does not match, check whether the secret is base64-encoded on one side and plain text on the other.
Limitations and notes
- Encrypted tokens (JWE, five parts) cannot be decrypted.
- Keys are not downloaded from a JWKS URL – copy the JSON from the URL and paste it instead.
- PKCS#1 "BEGIN RSA PUBLIC KEY" blocks are not supported; convert them to an SPKI "BEGIN PUBLIC KEY" block first.
- Verification checks the signature only. Whether the issuer, audience and other claims are acceptable depends on your application.
- Older browsers may not support EdDSA (Ed25519); the tool tells you if a key or algorithm is not supported.
Frequently asked questions
Is it safe to paste a token here?
The token is decoded by JavaScript in your browser and is not sent anywhere. Even so, treat production tokens like passwords: prefer expired or test tokens when you can.
Can anyone read the contents of a JWT?
Yes. The header and payload are only base64url-encoded. Never put secrets in a JWT payload; the signature only protects against changes, not against reading.
What does "Invalid signature" mean?
The token was changed after signing, or it was signed with a different key than the one you provided. Make sure you are using the right secret or the public key that matches the kid in the header.
Do I need the private key to verify a token?
No. RS, PS, ES and EdDSA tokens are verified with the public key. The tool refuses private keys so they are not pasted by accident.
Why is a token with "alg": "none" not verified?
Such a token has no signature, so there is nothing to check. Servers should reject unsigned tokens unless they explicitly expect them.