Skip to content
Logo Any Help Me

JWT Decoder

Note: This tool only decodes the JWT to let you view its contents. It does not verify the signature. Do not trust decoded tokens without verifying their signature on your backend.

Decoding Is Not Verifying

A JSON Web Token looks encrypted and is not. It is three base64url-encoded segments joined by dots, header, payload, signature, and the first two are plainly readable by anyone holding the token. The signature does not hide the contents; it only proves they were not altered after signing.

This decoder splits a token and renders the header and payload as formatted JSON so you can see what a token actually claims.

How to Decode a Token

Paste the whole token including both dots. Decoding happens as you type.

  1. Paste the token. It should have exactly two dots separating three segments.
  2. Read the header, which names the signing algorithm in `alg` and often a key id in `kid`.
  3. Read the payload, where the claims live, `sub`, `iss`, `aud`, `exp`, `iat` and whatever the issuing application added.
  4. Check `exp` against the current time. It is a Unix timestamp in seconds, not milliseconds, which is a common source of off-by-1000 confusion.
  5. Note that the signature segment is shown but not checked. Verification needs the secret or public key and belongs on your server.
  6. Use a test token rather than a live one, for the reason set out below.

What Each Segment Contains

The header is a small JSON object naming the algorithm, commonly `HS256` for a shared secret or `RS256` for a public/private key pair, plus `typ` and sometimes `kid` to tell the verifier which key to use. The payload holds registered claims like `iss`, `sub`, `aud`, `exp`, `nbf` and `iat`, alongside whatever custom claims the application defined.

The signature is computed over the encoded header and payload together. Change a single character of either and the signature no longer matches, which is what makes the token tamper-evident. Note the wording: tamper-evident, not confidential. Anyone who intercepts a token can read every claim in it, which is why tokens should never carry passwords, card numbers or anything else that would matter if seen.

Standard Registered Claims

The claims defined by the JWT specification, and what each is for.

ClaimNameMeaning
issIssuerWho issued the token
subSubjectWho the token is about, usually a user id
audAudienceWho the token is intended for
expExpirationUnix seconds after which it must be rejected
nbfNot beforeUnix seconds before which it is not yet valid
iatIssued atUnix seconds when it was created
jtiJWT IDUnique identifier, used to prevent replay

All three time claims are Unix seconds, not milliseconds. A token that appears to expire in 1970 or in the year 56000 is almost always a unit mismatch rather than a genuinely broken token.

Why the Signature Is Not Checked Here

Verifying a signature requires the key: the shared secret for HMAC algorithms, or the issuer’s public key for RSA and ECDSA. Pasting a production secret into a web page would be a worse idea than whatever problem it solved, so this tool deliberately decodes only. Trusting an unverified token is the single most common JWT vulnerability, and it belongs on your backend with a library that also checks `exp`, `aud` and the algorithm.

That last point matters more than it sounds. The classic JWT attack is algorithm confusion, an attacker changes `alg` to `none` or swaps RS256 for HS256 so the public key gets used as an HMAC secret. A verifier must pin the expected algorithm rather than trusting what the token declares. Decoding runs entirely in your browser and nothing is transmitted, but a live token in a browser tab is still a live credential, so use an expired or test token where you can.

Frequently Asked Questions

Is a JWT encrypted?
No. The header and payload are base64url-encoded, which is reversible by anyone. The signature makes a token tamper-evident, not confidential.
Can this tool verify the signature?
No, and deliberately so. Verification needs the secret or public key, and pasting a production secret into a web page would be a worse risk than the one it solves.
Why does the expiry date look wrong?
Almost always a units problem. The `exp`, `iat` and `nbf` claims are Unix seconds, not milliseconds, so a factor of 1000 puts the date in 1970 or far in the future.
What should never go in a JWT payload?
Anything confidential, passwords, card numbers, personal data you would not want read. Anyone holding the token can read every claim in it.
What is algorithm confusion?
An attack where the token’s `alg` is changed, for example to `none` or from RS256 to HS256, so the verifier uses the wrong key type. Verifiers must pin the expected algorithm.
Is it safe to paste a token here?
Decoding is local and nothing is transmitted, but a valid token is a live credential in a browser tab. Prefer an expired or test token.
What is the `kid` field for?
It identifies which key signed the token, so a verifier holding several keys knows which one to use. It appears in the header rather than the payload.

Explore more in Developer

View all →