The JWT Decoder parses JSON Web Tokens and displays the header, payload, and signature in readable format without requiring a secret key. It verifies HMAC signatures (HS256/384/512) with a shared secret, and asymmetric signatures (RS256, ES256, PS256 and their 384/512 variants) with a public key supplied in PEM or JWK form. All verification runs in the browser via the Web Crypto API.
How it Works
1Paste a JWT into the token field — the header and payload are Base64URL-decoded and rendered immediately, along with expiry and issued-at timestamps.
2Open the Verify Signature panel. For HS* tokens, enter the shared HMAC secret (UTF-8 or Base64). For RS*/ES*/PS* tokens, paste the public key as PEM (SPKI) or a JWK JSON object.
3The tool imports the key with crypto.subtle.importKey and checks the signature with crypto.subtle.verify — matching the algorithm and hash declared in the token header.
4Switch to the Encode / Sign tab to build a custom JWT and sign it with an HMAC secret.
Frequently Asked Questions
Can this decode JWTs without the secret key?
Yes. The header and payload of a JWT are Base64URL-encoded, not encrypted. Any decoder can read them — only the signature requires the secret or public key to verify authenticity.
Is it safe to paste my JWT here?
The tool runs 100% in your browser — your token and keys are never sent to a server. Avoid sharing active session tokens in public places regardless.
What algorithms does it support?
Verification supports HS256/384/512 (HMAC secret), RS256/384/512 (RSA PKCS#1 v1.5), PS256/384/512 (RSA-PSS), and ES256/384/512 (ECDSA on P-256/P-384/P-521).
Can I verify RS256 / ES256 signatures?
Yes. Paste the public key in PEM or JWK form and the tool verifies the signature locally using your browser's Web Crypto APIs. The key never leaves your device.
Why does my JWT show as expired?
The exp claim contains a Unix timestamp. The tool compares it to your current local time and flags it as expired if the timestamp is in the past.