JWT Decoder
Decode and inspect JWT header and payload in your browser. No signature verification — paste tokens from logs safely. Runs entirely client-side.
JWT Decoder
Runs entirely in your browser — no server calls, no tracking.
Paste a JWT and click Decode.
🔒 Your data never leaves this tab. This tool has no backend.
About the JWT Decoder
A JWT (JSON Web Token) is a compact, URL-safe token format used for authentication and information exchange between services. A JWT has three Base64url-encoded parts separated by dots: the header (algorithm and token type), the payload (claims — user ID, roles, expiry), and the signature. This tool decodes the header and payload, shows expiry status, and clearly notes that the signature is not verified — because signature verification requires the secret key.
What the claims mean
sub — subject (usually the user ID). iat — issued at (Unix timestamp). exp — expiry (Unix timestamp). aud — audience (the intended recipient service). iss — issuer (the authentication server). jti — JWT ID (unique identifier for this token, used for revocation). These are standard claims; applications add custom claims alongside them (roles, permissions, org IDs).
Using this tool safely
This tool runs entirely in your browser — pasting a JWT here does not expose it to any third party. That said, production JWTs from live systems contain real user identifiers and session data. If you are debugging a production system, prefer to copy the JWT into a local tool or this browser-only decoder rather than a server-side service. Treat long-lived JWTs (weeks or months of expiry) as secrets.
Remember: decoding a JWT does not mean trusting it. Any client can craft a JWT payload with any claims — only the signature, verified with the correct key, proves the token is authentic. Always verify signatures on the server before trusting JWT claims.
Decoding is not verifying — and why that matters
A JSON Web Token is three base64url segments separated by dots: header.payload.signature. The header names the signing algorithm, the payload carries the claims, and the signature proves the first two have not been altered.
The critical point: the header and payload are encoded, not encrypted. Anyone holding the token can read every claim in it — no key required. That is what this decoder does, and it is why you must never put passwords, card numbers or other secrets in a JWT payload.
Decoding vs verifying
| Decoding | Verifying |
|---|---|
| Reads the claims | Checks the signature against a key |
| Needs no key | Needs the secret or public key |
| Safe in a browser | Must happen on your server |
A decoded token tells you what it claims to be, never that the claim is true. Authorisation decisions must always come from server-side verification.
The claims worth checking
exp expiry and iat issued-at are Unix timestamps — our timestamp converter turns them into readable dates. iss names the issuer, aud the intended audience, and sub the subject, usually a user ID. An expired exp is the single most common cause of a token that “suddenly stopped working”.
Common failures
Beyond expiry: clock skew between servers rejecting a valid token, an aud mismatch when one service's token is sent to another, and algorithm confusion where a server is tricked into accepting alg: none or into treating an RSA public key as an HMAC secret. Always pin the expected algorithm rather than trusting the header.
Frequently asked questions
Only into one that decodes locally. This decoder runs entirely in your browser and never transmits the token. Be careful generally: a JWT is a bearer credential, so anyone who obtains a live token can use it until it expires. Never paste a production token into a tool that sends it to a server.
Decoding reads the claims and needs no key, because the header and payload are only base64url encoded. Verifying checks the signature against a secret or public key and proves the token has not been tampered with. Decoding tells you what a token claims; only verification tells you whether to believe it.
Yes. JWT payloads are encoded, not encrypted, so anyone holding the token can read every claim without a key. Never put passwords, payment details or other sensitive data in a JWT payload — put an opaque user ID in and look the rest up server-side.
The exp claim is a Unix timestamp; once it passes, verifiers reject the token. If it looks like it should still be valid, check for clock skew between the issuing and verifying servers — even a small drift rejects tokens near the boundary. Paste the exp value into a timestamp converter to see the exact expiry.
jsonwebtoken in Node, PyJWT in Python).Need JWT authentication built for your app?
ruxox builds auth systems, API security, and access control for production web apps. Free estimate in 48 hours.