When users report being logged out at random, the first thing to check is the token's exp claim. A JWT looks opaque, but it is really three dot-separated parts — header, payload, signature — and the first two are only Base64URL encoded, not encrypted. Anyone holding the token can read them.
Paste a token here and the header and payload are expanded into readable JSON, while iat, nbf and exp are rendered as real dates with the remaining lifetime calculated for you. If you know the HMAC secret, the browser's Web Crypto API verifies HS256, HS384 and HS512 signatures locally — the secret never leaves the page.
How to use
- Paste the token — A leading
Bearerprefix is stripped automatically, so you can paste an Authorization header value directly. Algorithm, type and expiry badges appear as soon as the token parses. - Read the expiry status — The three cards show issued-at, not-before and expiry with the time remaining. Under an hour left turns amber; already expired turns red.
- Inspect the claims — Review the full header and payload JSON, then scan the registered-claims table below for the meaning of
iss,sub,aud,jtiand friends. Each panel has its own copy button. - Verify the signature if you need to — Enter the HMAC secret in the signature panel and the result appears instantly. The sample token's secret is
your-256-bit-secret.
Frequently asked questions
Is it safe to paste a JWT here?
This tool runs entirely in your browser, so the token is never transmitted.
That said, the general rule stands: never paste a live production access token into any online tool. The token is itself the credential, so a leak is an account takeover. Debug with expired tokens or tokens minted for a test account, and if you do expose a production token, revoke the session and rotate the signing key immediately.
Can I put a password or personal data in the payload?
No. A JWT payload is encoded, not encrypted.
Base64URL is a reversible transformation, so anyone holding the token reads the payload in full. The signature proves the contents were not tampered with; it does not hide them. Keep national ID numbers, phone numbers, email addresses and other sensitive fields out of the payload — carry an opaque identifier in sub and look the rest up server-side.
Signature verification says 'unsupported'.
In-browser verification covers only the symmetric algorithms HS256, HS384 and HS512.
RS256 and ES256 tokens need the issuer's public key, normally fetched from a /.well-known/jwks.json endpoint. This site makes no outbound requests by design, so those algorithms are not verified here. Decoding and expiry checking work regardless of algorithm.
What is an `alg: none` token?
A token with no signature — the cause of the most famous vulnerability class in JWT's history.
If an attacker rewrites the header's alg to none and drops the signature, any implementation that trusts the header will accept the forged token. Servers must pin the expected algorithm in code and never trust the token's own alg. If you see an alg: none badge here, go audit whatever produced that token.
Concepts worth knowing
The three parts of a JWT
A JWT is header.payload.signature. The header carries the signing algorithm (alg), the type (typ) and often a key ID (kid). The payload holds claims as key-value pairs. The signature is the header.payload string signed with the secret or private key.
All three parts use Base64URL rather than plain Base64 — - and _ replace + and /, and trailing = padding is dropped — so the token can be placed in a URL or HTTP header without escaping.
exp, iat and nbf
iat is when the token was issued, exp when it expires, and nbf the earliest moment it is valid. All three are Unix timestamps in seconds. JavaScript's Date.now() returns milliseconds, so you must divide by 1000 before comparing — a units mismatch that causes a surprising number of production bugs.
Because server clocks drift, verification libraries usually offer a clockTolerance of around 30 seconds. If requests fail intermittently right around expiry, check that setting first.
Access tokens and refresh tokens
A JWT cannot easily be revoked before it expires — statelessness is both its strength and its weakness. That is why production systems pair a short-lived access token (5–30 minutes) with a longer-lived refresh token (days to weeks).
A leaked access token then has a small blast radius, while the refresh token lives in a server-side store and can be destroyed instantly on logout or account suspension. If you find an access token here with an exp months in the future, revisit that lifetime policy.