Read a token without handing it over.
Decode a JWT in your browser, nothing sent: read its claims and expiry, verify it with a secret, PEM key or JWKS, and see warnings such as alg none.
By Suraj KumarUpdated 5 min read
A JSON Web Token is three pieces of Base64url joined by dots, and reading one takes a second. The trouble is that the token is often a live key to an account, which is a poor thing to paste into a stranger's server.
Paste it, and read every claim.
Open the JWT decoder and paste a token, with or without Bearer in front. The header and payload are shown with every number exactly as written, and each claim is said in plain words with where it is defined: RFC 7519 for iss, sub, aud, exp, nbf, iat and jti, OpenID Connect for the person's details, RFC 9068 for scopes and roles. Times are shown in UTC with how long ago or ahead they are, and the expiry counts down while you look.
Paste anything in the toolkit and a token is recognised and opened here. PASETO and opaque tokens are named as what they are, rather than taken for broken JWTs.
What should worry you.
The decoder warns of what RFC 8725, the JWT best practices, warns of: alg none, which means the token is not signed at all; a token with no expiry, or one already expired or not valid yet; jku and x5u headers that point a careless service at an attacker's key; a header that carries its own key; and names given twice, which libraries read differently.
It also tries a list of secrets that are often left as they came, such as your-256-bit-secret from jwt.io's sample. A token signed with one of them can be forged by anyone, and the page says so. The list is tried on your device.
Decoding is not verifying.
Anyone can write a header and payload; only the signature says who made them. Verify checks it with the key: a shared secret for HS256, HS384 and HS512, written as text, hex or Base64; for RS, PS, ES and EdDSA, the public key as PEM, a certificate, a JWK, or the issuer's key set (JWKS), chosen by the token's kid. Older key files from OpenSSL (BEGIN RSA PRIVATE KEY, BEGIN EC PRIVATE KEY) are read as they are.
Fetch the JWKS asks the issuer for its public keys, from your browser, only when pressed, and never sends the token. Many issuers do not let other sites read their keys; the page then says so, and the key set can be pasted instead. A valid signature says that the holder of the key made the token, not that the claims are true or that the service should trust that key.
Encrypted tokens, and tokens of your own.
An encrypted token (JWE, five parts) shows its header, and its payload once you give the key. Make a token signs a header and payload as you write them, with any of the thirteen algorithms, and can make a fresh key pair for RS, PS, ES and EdDSA, all on your device, for tests and local development.
Nothing leaves your browser.
Tokens, secrets and keys are read on your device and never sent, kept or put in a share link. The only request the page can make is Fetch the JWKS, and only when you press it.
Further reading
Topics: jwt decoder · decode jwt · decode jwt locally · jwt decode offline · verify jwt · jwt.io alternative · jwks · json web token · jwt alg none
A little less theory. A little more doing.
Try it on your own terms, with a free browser tool.
Try the tool