JWT decoder
This tool splits any JSON Web Token into its header, payload claims, and raw signature, decoding the readable parts so you can inspect exactly what a token contains. It’s for developers debugging auth flows, checking why a token is rejected, or confirming which claims and expiry an identity provider issued — all without a network request.
How it works
A JWT is three Base64URL-encoded segments joined by dots. The tool splits on .,
then decodes the first two segments with a Base64URL-safe atob (it first swaps
-/_ back to +// and restores padding), and runs JSON.parse on the
result to show the header and payload as key-value pairs. The signature is shown
raw. When “Decode timestamps” is on, numeric time claims (exp, iat, nbf,
auth_time, updated_at) are read as Unix seconds and converted with
new Date(value * 1000) to a readable UTC string. An exp earlier than the
current time is highlighted in red as expired.
Example
The token below (HS256, demo only):
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJleHAiOjE3MDAwMDAwMDB9.sig
decodes to a header of {"alg":"HS256","typ":"JWT"} and a payload of
{"sub":"123","exp":1700000000}. With timestamps on, exp: 1700000000 shows as
2023-11-14 22:13:20 UTC and is flagged expired.
What the tool does and does not do
| Action | Supported |
|---|---|
| Decode header (alg, typ) | Yes |
| Decode payload claims | Yes |
| Convert exp / iat / nbf to dates | Yes |
| Flag expired tokens | Yes |
| Verify the signature | No (needs the server-side secret/public key) |
Decoding happens entirely in your browser, so this is safe to use with real tokens — your token never leaves your device.
Common debugging scenarios
“Why is this token being rejected?” Paste it in and turn on timestamp decoding. The most common reasons a token is rejected are: the exp has already passed (highlighted red), the iss or aud claim does not match what your server expects, or the alg in the header does not match what the verifier is configured to accept. Reading the header and payload directly shows you which of these applies before you dig into server logs.
“What claims does my identity provider issue?” Different providers — Auth0, Cognito, Azure AD, Okta, Keycloak — include different sets of claims in their tokens. Decoding a sample token quickly shows you the exact keys and values so you can write your application code against real data rather than documentation that may be out of date.
“Is this token encrypted or just signed?” A signed JWT (JWS) has a human-readable payload that base64url-decodes to JSON. An encrypted JWT (JWE) has five segments rather than three and the payload segment is ciphertext — it will not decode to readable JSON. If you paste a five-segment token and get garbled output, you have a JWE and need to decrypt it with the appropriate private key server-side first.
Reading the header
The header tells you two things: the algorithm (alg) used to sign the token, and the token type (typ, almost always JWT). It may also include a kid (key ID) that tells the verifier which key from the issuer’s JWKS endpoint to use for signature verification.
Common alg values:
| Algorithm | Type | Description |
|---|---|---|
HS256 | Symmetric | HMAC with SHA-256; same secret to sign and verify |
RS256 | Asymmetric | RSA with SHA-256; private key signs, public key verifies |
ES256 | Asymmetric | ECDSA with P-256 and SHA-256 |
none | None | Unsigned; must never be accepted by a secure verifier |
If you see alg: none, that is a significant red flag — it means the token is not signed at all. A secure server should reject it outright.
Privacy note
Because decoding is entirely local, this tool is safe to use with tokens from real environments during debugging. Your token bytes never leave your device. That said, avoid pasting tokens into any online tool you cannot inspect, as tokens from a production session grant access until they expire.