About JWT Decoder
JWT Decoder is a browser-based tool for inspecting and verifying JSON Web Tokens β the URL-safe token format used by OAuth 2.0, OpenID Connect, Auth0, Firebase, AWS Cognito, and countless bespoke authentication systems. Paste the encoded token and instantly see its header, payload, and signature. Standard claims like iat, exp, nbf, iss, sub, aud, and jti are surfaced with human-readable timestamps and expiry checks.
Signature verification runs entirely client-side via the browser's Web Crypto API β HS256/384/512 with a shared secret, or RS256/384/512 and ES256/384 with a PEM public key. Nothing is sent to a server, so it's safe to test tokens containing sensitive claims.
100% client-side: decoding, claim inspection, and signature verification all run in your browser. Never paste production tokens into online tools you don't trust β this one runs locally with zero telemetry.
How to use
Paste your JWT
Left panel accepts the compact three-segment token (header.payload.signature). Segments are color-coded live.
Read the decoded output
Right panel shows header + payload as pretty-printed JSON, plus a claims table with timestamps converted to your local time.
Verify the signature
Paste your secret (HS*) or public key PEM (RS*/ES*) into the verify box and click Verify. Get a pass/fail with clear reason.
Copy
Header JSON, payload JSON, or the whole decoded blob β one click each.
Key Features
Live syntax-highlighted input
Header segment glows red, payload purple, signature blue β makes it easy to see the token structure at a glance and spot missing dots.
Standard claim breakdown
iat (issued at), exp (expiration), nbf (not before) show as concrete local timestamps + relative time. iss (issuer), sub (subject), aud (audience), jti (JWT ID) are labeled clearly.
Expiry check
Instantly see if the token is expired, will expire soon, or is still valid. Expired tokens show a red banner with "expired X minutes ago"; valid tokens show green with time-remaining.
Signature verification (5 algorithms)
HS256 / HS384 / HS512 β paste the shared secret. RS256 / RS384 / RS512 β paste the PEM public key (SPKI). ES256 / ES384 β same, ECDSA public key. Verification uses the browser's Web Crypto β no third-party libraries, no server call.
"None" alg warning
If you paste a token with alg: none, the tool flashes a red warning β this is a well-known JWT security foot-gun where implementations that don't check accept unsigned tokens as valid.
Sample tokens
Four presets: canonical HS256 example, expired token, no-alg token (for testing your validator's resilience), and a Auth0-style RS256 payload.
Copy anything
Header JSON, payload JSON, or the full {header, payload} object. Each with its own Copy button.
Common Use Cases
- Debugging why an API returns 401 β is the token expired? Missing a claim?
- Inspecting an Auth0 / Firebase / Cognito / Okta ID token
- Verifying OAuth 2.0 access tokens returned by your identity provider
- Learning what claims your auth system is emitting (compare dev vs prod)
- Testing your JWT library correctly rejects
alg: none - Sanity-checking a token from a bug report before touching the code
- Confirming a rotated signing key still verifies existing tokens
- Copying the decoded payload into a bug ticket or documentation
Security & Privacy
- 100% client-side: decoding + verification via Web Crypto in your browser. No token, secret, or private data ever leaves your device.
- Works offline: disconnect after page load and it still works.
- Warning about secrets: HMAC "secrets" pasted here are technically visible to any browser extension you have installed. If you have unknown extensions enabled, use an incognito window or a browser without extensions for real production secrets.
- Private keys: the verify field only accepts public keys β never paste a private key or signing key here. Verification is signature-checking only, not signing.
- alg: none: some naive implementations accept tokens with
alg: noneas valid. If your validator does, that's a critical bug β this tool lets you test. - JWT is not encryption: the payload is base64-encoded, not encrypted. Anyone with the token can read it. Don't put secrets in JWT payloads.