About the JWT Decoder
A JSON Web Token (JWT) is a compact, URL-safe way of representing claims between two parties. JWTs are the most common way to carry user identity through a stateless web API: the server signs a token containing the user's ID and a few other claims, the client stores it (in memory, in localStorage, or in a cookie), and every subsequent API call includes the token in an Authorization header. JWTs are widely used in OAuth 2, OpenID Connect, and most "Login with…" flows.
A JWT is three Base64URL-encoded segments separated by dots: header.payload.signature. The header and payload are JSON. This tool splits a JWT and shows the decoded header and payload, including human-readable timestamps for the standard exp, iat, and nbf claims. Verification of the signature is not performed here — that requires the issuer's public key, which would have to be supplied or fetched.
What is inside a JWT
The header declares the signing algorithm (HS256, RS256, ES256 are the most common). The payload contains "claims": registered claims defined by the spec (iss, sub, aud, exp, iat, nbf, jti), and any number of custom claims the application chooses. The signature is computed over the header and payload with a secret (HMAC) or a private key (RSA, ECDSA), and prevents tampering: any change to header or payload invalidates the signature.
Important: decoding does not mean trusting
A decoded JWT is just data — anyone with the token can read its payload, because Base64URL is not encryption. Never put sensitive data (passwords, full credit card numbers) into a JWT payload. Trusting the payload requires verifying the signature against the issuer's key. This tool does not verify; it only decodes. Treat decoded payloads as untrusted until verified server-side.
How to use the JWT Decoder
Paste the JWT
Drop the full token (the long string with two dots) into the input box.
Read the decoded header and payload
Both are shown as formatted JSON. Standard timestamp claims (exp, iat, nbf) are also rendered in a human-readable form.
Check expiry at a glance
If the token is expired (exp in the past), the tool flags it clearly. If not yet valid (nbf in the future), that is flagged too.
Worked examples
Example 1
Input: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhbGljZSIsImV4cCI6MTcwMDAwMDAwMH0.signature
Result: Header: { "alg": "HS256" } / Payload: { "sub": "alice", "exp": 1700000000 }
A minimal example. In practice payloads carry many more claims.
Real-world use cases
- Debugging "401 Unauthorized" errors by checking whether the token is expired.
- Inspecting claims sent by an OAuth identity provider during integration testing.
- Confirming that a custom claim you added on the server actually appears on the client.
- Quickly checking whether two tokens carry the same user ID.
- Teaching the JWT structure to a teammate without firing up a debugger.
Tips & common mistakes
- A JWT is not encrypted. Anyone who can read the token can read the payload. Use HTTPS in transit and never include secrets in claims.
- The alg header should not be trusted on the client side. Servers must enforce the expected algorithm — accepting alg=none has caused major security breaches.
- Short expiry times (15 minutes to an hour) plus a refresh token is the modern recommended pattern. Long-lived JWTs are a frequent source of session-hijacking incidents.
- A leaked JWT is valid until its exp. There is no easy revocation mechanism without server-side state. Treat tokens like passwords.
Frequently asked questions
Does the tool verify the signature?
No. Verification requires the issuer's secret or public key. Decoding alone tells you what the token claims, not whether it is genuine.
Is my token sent anywhere?
No. Decoding is purely client-side string manipulation. The token never leaves your browser.
Why does "exp" look like a huge number?
It is a Unix timestamp — seconds since 1970-01-01 UTC. The tool also displays it in human-readable form.
What is the difference between JWT, JWS, and JWE?
JWS is the signed form of a JWT (header.payload.signature). JWE is the encrypted form, where the payload itself is encrypted. Almost every JWT you encounter is actually a JWS. Encrypted JWEs are less common and have a different structure.
Related tools
Last updated: June 2026 · All processing happens locally in your browser.