What a JWT is, and what you actually see when you decode one
A JSON Web Token in compact form is three blocks separated by dots: header.payload.signature. The first two are JSON encoded in Base64URL — encoded, not encrypted. Anyone holding the token can read them. Decoding breaks nothing; it simply undoes a transport encoding.
Which leads to the single most important rule: never put sensitive data in a JWT payload. Passwords, card numbers and personal data you would not show the client have no place there. The signature protects integrity, not confidentiality.
Decoding is not verifying
This tool decodes; it does not verify. Reading the payload tells you what the token *claims*, not whether that claim can be trusted. Verification means recomputing the signature with the correct key — an HMAC secret or an RSA/ECDSA public key — and confirming it matches, and that belongs on your server.
A token with perfect claims and an invalid signature is still a forged token. When you are debugging a 401, decoding tells you what is inside; verifying on the server tells you why it was rejected.
The claims that almost always matter
iss (issuer) and aud (audience) answer "who minted this" and "who is it for". A perfectly valid token issued for another service should not work on yours — validating aud is what prevents that hop.
iat, nbf and exp are NumericDate values: seconds since 1 January 1970 UTC, not milliseconds. This is the most common mix-up in the spec, and it produces tokens that expired in 1970 or expire in 55,000 years. Here they are shown as local dates.
sub identifies the subject and jti gives the token a unique ID, which is what revocation lists key on.
Why alg: none is flagged in red
alg: none means "this token carries no signature". The specification allows it for cases where integrity is already guaranteed by another layer, but for years it was the basis of a classic attack: take a legitimate token, change the header to none, empty the signature, and hand it to a library that trusted the header to decide how to validate.
The defence is to never let the token choose its own algorithm. Pin the expected algorithm on your backend and reject anything else. If you see alg: none in production, treat it as an incident until proven otherwise.
What this tool does not do
It decodes compact JWS with three segments. It does not verify signatures, does not generate or sign tokens, and does not decrypt JWE: paste a five-segment token and it will tell you the payload is encrypted and needs the private key.
It also stores nothing. The token is not sent over the network, not written to localStorage and not placed in the URL, so reloading the page clears it. Even so, a live production token is a credential — if you have pasted one anywhere, the healthy move is to rotate it.