JWT Decoder

Decode a JSON Web Token's header and payload and check whether it has expired. Nothing is uploaded.

Paste a JSON Web Token to see its header and payload decoded, its algorithm identified, its registered claims explained, and — most usefully — whether it has already expired. Decoding happens entirely in your browser, so the token is never transmitted. This tool decodes; it deliberately does not verify signatures, because that would require you to paste a signing key.

This decodes, it does not verify. A JWT payload is only Base64 — anyone holding the token can read it, and this page does the same thing locally in your browser. Checking that the signature is genuine needs the signing secret or public key, which should never be pasted into any website, including this one. Treat a token you paste anywhere as compromised, and never paste a production token.
JWT
Decoded token

How JWT Decoder works

A JWT is three Base64url-encoded sections joined by dots: header, payload and signature. The header names the signing algorithm. The payload holds the claims — who the token is about, who issued it, when it expires, plus whatever custom fields your application added. The signature is a cryptographic proof that the first two parts have not been altered.

The critical thing to internalise is that **the payload is not encrypted**. It is ordinary Base64, which anyone holding the token can read in seconds — this page does exactly that, locally. Developers regularly put email addresses, user IDs, roles and internal identifiers into a JWT payload assuming it is opaque. It is not. A signed JWT guarantees integrity, not confidentiality. If a value must stay secret from the token's holder, it does not belong in a JWT.

That is also why this tool does not verify signatures. Verification needs the shared secret or the public key, and pasting a signing secret into any website hands over the ability to mint valid tokens for your system. No web page should ask for that, so this one does not. If you need verification, do it in your own code or with a local CLI.

The expiry check is the reason most people decode a token by hand. The `exp` claim is a Unix timestamp in seconds — not milliseconds, which is a classic bug when generating tokens from JavaScript, where `Date.now()` returns milliseconds and produces tokens valid for roughly fifty thousand years. This tool converts `exp`, `iat` and `nbf` into readable UTC timestamps and tells you how long is left, or how long ago it lapsed.

One security note worth carrying away: if a token's header says `"alg": "none"`, treat it as unsigned and untrusted. Accepting such tokens was a well-known vulnerability in early JWT libraries, and any implementation that still allows it is broken.

How to use JWT Decoder

1

Paste the token

Paste the full JWT — three dot-separated sections. Strip the "Bearer " prefix if your token came from an Authorization header.

2

Read the decoded output

Header, payload, timestamps as readable dates, and an explanation of each standard claim it contains.

3

Check the expiry badge

If the token carries an exp claim, you get a plain-language verdict — valid for another two hours, or expired three days ago.

Frequently Asked Questions

Does this verify the signature?
+
No, deliberately. Verification needs the signing secret or public key, and pasting a secret into a website would let whoever runs it forge tokens for your system. Verify in your own code instead.
Is my token sent anywhere?
+
No. Decoding happens entirely in your browser. Even so, treat any token you paste into any tool as potentially compromised, and never paste a live production token.
Is the JWT payload encrypted?
+
No. It is plain Base64 and anyone holding the token can read it instantly. A signature proves the token has not been tampered with — it does not hide the contents.
How do I tell if a token has expired?
+
The exp claim is a Unix timestamp in seconds. This page converts it to a readable date and shows a badge saying how long the token is valid for, or how long ago it expired.
Why does my token appear to expire in the year 55000?
+
The exp claim was almost certainly set in milliseconds instead of seconds. JavaScript's Date.now() returns milliseconds, so divide by 1000 when generating tokens.
What do the standard claims mean?
+
iss is the issuer, sub the subject the token is about, aud the intended audience, exp the expiry, nbf the earliest valid time, iat the issue time and jti a unique token ID. Everything else is custom to your application.
What does "alg": "none" mean?
+
It means the token is unsigned. Accepting such tokens was a serious early JWT vulnerability — any library that still honours it is unsafe. Treat these tokens as untrusted.
Can I decode an expired or invalid token?
+
Yes. Decoding only reads the Base64 sections, so expiry and signature validity make no difference to what you can inspect.

Related tools