JWT decoder
Decode a JSON Web Token, read its claims and dates, and check its signature. Everything runs in your browser: the token and the key are never sent anywhere.
Questions
Is my token or key sent anywhere?
No. Decoding and signature checks run in your browser, with JavaScript and the browser’s WebCrypto API. The page makes no network requests with the token or the key and never puts either in the address bar or your history. As a rule, don’t paste production tokens or secrets into online tools that send data to a server. This one doesn’t: you can watch the Network tab of your browser’s developer tools while you use it.
Does decoding a token mean it is valid?
No. Anyone can decode a JWT: the header and payload are only Base64URL-encoded, not encrypted. A token can be trusted only when its signature checks out with the issuer’s key and its exp, nbf, iss and aud claims fit. Never put secrets in a JWT payload.
Which key do I paste?
For HS256, HS384 and HS512, the shared secret the token was signed with, as text or Base64. For RS, PS, ES and EdDSA tokens, the issuer’s public key: a PEM block (BEGIN PUBLIC KEY or BEGIN RSA PUBLIC KEY), an X.509 certificate or a JWK. You can paste a whole JWK set, such as the issuer’s jwks.json; the key is picked by the token’s kid. Never paste a private key: verifying needs only the public key.
Why doesn’t the signature match?
Usually one of these: the wrong key (keys rotate, so match the kid), a Base64 secret entered as text or the other way round, a token copied with a character missing, or a token changed after it was signed. An ES256 signature must be the raw 64 bytes JWS uses; a DER-encoded signature is reported as such.
What does alg: none mean?
The token has no signature, so anyone can create or change it. Services must reject it. Libraries have had bugs where an attacker set alg to none, or switched RS256 to HS256 and signed with the public key as the secret, so a service should accept only the algorithms it expects (RFC 8725).
How are exp, nbf and iat read?
They are NumericDates: seconds since 1 January 1970 UTC. The page shows each in UTC and in your local time. A token is expired from the exp second on and isn’t valid before nbf. Servers often allow a minute or two of clock difference. A value in milliseconds or written as a string is flagged, because many libraries reject it.
Can it decrypt an encrypted token (JWE)?
No. A JWE has five parts and an encrypted payload. The page shows its header, which names the key-management and encryption algorithms. Decrypting needs the recipient’s private key, which should stay on the server.