JWT Decoder
Free JWT decoder. Read the header and payload of any JSON Web Token, see expiry in plain language, and verify HS256 signatures — all in your browser.
Decoding happens in this tab. The token is never sent anywhere — which matters, because a JWT is a live credential.
Header
{
"alg": "HS256",
"typ": "JWT"
}Payload
{
"sub": "1234567890",
"name": "Ada Lovelace",
"iat": 1755120000,
"exp": 1912886400,
"role": "admin"
}Validity
Within time window — signature not implied
- Expires at
(exp) - 8/14/2030, 2:50:00 AM (in 1396d)
- Issued at
(iat) - 8/14/2025, 2:50:00 AM (430d ago)
Claims explained
- sub
- 1234567890Subject — who the token is about
- name
- Ada Lovelace
- iat
- 1755120000Issued-at time
- exp
- 1912886400Expiry time
- role
- adminRole claim (application-specific)
Signature
qGH8vYbHXG0J7L4nJ8kZoqvV6uQXcYh0Xy1kZ3n5cQw
Decoding is not verifying. Anyone can read a JWT's payload — it is only Base64, not encryption. Never put a password, a card number or anything private in one, and never trust its claims on the server without checking the signature.
A JSON Web Token is a login session, an API key or a password-reset link compressed into a single string. When something is failing — an endpoint returns 401, a user is logged out too early, a permission is missing — the first question is always the same: what is actually inside this token?
This decoder shows the header and payload as readable JSON, translates the timestamps into plain language, explains the standard claims, and can verify HS256, HS384 and HS512 signatures if you supply the secret. Everything happens in your browser, which matters more here than for almost any other tool: a JWT is a live credential.
How to use the JWT Decoder
Paste the token
With or without a leading "Bearer" — it is stripped automatically.
Read the header
It tells you the signing algorithm and, often, which key was used.
Read the payload
Every claim is shown, with the standard ones explained and the times converted to your local clock.
Check validity
Expired, not-yet-valid or currently valid is shown at a glance, with the exact times.
Verify the signature (optional)
For HMAC tokens, paste the shared secret to confirm the token is genuine.
The three parts
A JWT is three Base64url segments joined by dots. The header says how it was signed. The payload carries the claims — who the token is about, what it permits, when it expires. The signature is a cryptographic check over the first two, which proves they have not been altered.
The critical point, and the one most often missed: the first two parts are *encoded*, not encrypted. Anyone holding the token can read them, exactly as this page just did. A JWT hides nothing.
Never put anything private in a payload
Because the payload is readable by anyone who has the token — including the user it was issued to, and anyone who obtains it from a log file, a browser extension or a shared device — it must never contain a password, a card number, a national identity number, a private key, or anything else you would not print on the outside of an envelope.
What belongs in a payload is an identifier and a set of permissions, both of which the server can check against its own records. If the data genuinely must travel encrypted, that is JWE, a different specification.
The standard claims
| Claim | Meaning | Notes |
|---|---|---|
| iss | Issuer | Who created the token — always check it matches who you expect |
| sub | Subject | Who the token is about, usually a user ID |
| aud | Audience | Which service the token is for; reject tokens issued for someone else |
| exp | Expiry | Unix seconds. A token without one never expires — almost always a bug |
| nbf | Not before | The token is invalid until this time |
| iat | Issued at | When it was created; useful for detecting an unexpectedly old session |
| jti | Token ID | A unique identifier, used to revoke or to prevent replay |
All JWT times are Unix seconds, not milliseconds. Passing them straight to JavaScript’s Date constructor gives a date in 1970 — multiply by 1000 first.
Decoding is not verifying
Reading a token proves nothing. Anyone can craft a JWT with "role": "admin" in the payload and hand it to your server. What separates a genuine token from a forged one is the signature, and only the server holding the key can check it.
There is a notorious attack that follows from this: a token whose header says "alg": "none", submitted to a library that trusts the header rather than the algorithm the application expects. Always pin the expected algorithm server-side and reject anything else.
HMAC versus public-key signing
HS256, HS384 and HS512 use one shared secret for both signing and verifying. That is simple, and it is why this page can verify such a token when you supply the secret — but it also means every service that needs to verify must hold the secret, and therefore could also mint tokens.
RS256, ES256 and their relatives use a private key to sign and a public key to verify. That lets many services check tokens without any of them being able to issue one, which is why every serious identity provider uses them. Verifying such a token requires the issuer's public key, so it cannot be done here.
Frequently asked questions
Is it safe to paste a JWT into this page?
The decoding happens entirely in your browser and nothing is transmitted. That said, treat any token as a live credential: prefer an expired or test token, and rotate anything you have pasted into a tool you do not control.
Can I decode a JWT without the secret?
Yes — the header and payload are Base64url-encoded, not encrypted, so they are readable by anyone. The secret is only needed to verify the signature.
Why does my token show as expired?
The exp claim is a Unix timestamp in seconds and is compared against your device clock. Check that your system time is correct before assuming the token is at fault.
Can this verify an RS256 token?
No. RS256 and ES256 need the issuer’s public key. Only HMAC algorithms — HS256, HS384 and HS512 — can be verified with a shared secret, and those are supported here.
Is a JWT encrypted?
No. It is signed, which prevents tampering but not reading. Never place a password, a card number or any other secret inside the payload.
What does "alg": "none" mean?
An unsigned token. It exists in the specification but is a well-known attack vector — a server must always require the algorithm it expects rather than trusting the one in the header.
100% private. Files are processed on your device and never uploaded.
Instant results. No upload queue. Processing time depends on your device.
Free forever. No signup, no watermark, no paid tier.
Works everywhere. Use a modern browser on your phone or computer.
Related tools
JWT Decoder is one of all the free tools on ToolNest. No account or subscription needed — anywhere in the world.