JWT Signature Verifier
Check a JWT the way a careful server should: signature, algorithm, keys and every claim.
Try before you buy.
- Free preview: the verdict and every count, the token’s decoded header and claims, and the first checks of the report (up to 10).
- Locked until you unlock it: download and copy.
- Unlock: Pro pass, ₹179 for 30 days or ₹79 for 1 week, a one-time payment that never renews. Unlock: Pro pass, $5.99 for 30 days or $2.99 for 1 week, a one-time payment that never renews.
Ways to unlock shows how to get the full result.
Printing this result is locked in the free preview.
Token and key
For a JWK Set, the key whose kid matches the token is used. Nothing is uploaded.
Validation rules
Several allowed values: separate them with commas.
Result
Paste a token and a key to check them.
Decoded header and claims
Header
Payload
Locked in the free preview. Opens the ways to unlock this result.
Locked in the free preview. Batch runs unlock with a pass.
Locked in the free preview. Query results unlock with a pass.
About the JWT Signature Verifier
Decoding a JWT shows what it claims; verifying it shows whether to believe it. Paste a token and the key you trust — a shared secret for HS256, the issuer’s PEM public key or certificate, a JWK, or the issuer’s JWK Set (the key is chosen by the token’s kid) — and the page checks the signature with your browser’s Web Crypto, then everything a careful relying party checks: an algorithm allow-list, alg: none, algorithm confusion (an HS token checked with a public key), secrets shorter than RFC 7518 §3.2 allows, exp, nbf and iat with clock skew, the issuer, the audience and the type.
Every check comes with the rule behind it — RFC 7519, RFC 7515, RFC 7518 and the JWT Best Current Practices of RFC 8725 — and the risky header parameters are named: jku and x5u URLs, an embedded jwk, unknown crit entries and a kid that looks like a path or SQL. HS256, HS384, HS512, RS256–RS512, PS256–PS512, ES256–ES512 and EdDSA (Ed25519) are supported. Nothing is uploaded: the token, the secret and the keys stay in your browser.
Without a pass you see a free preview: the verdict, every count and the token’s header and claims, with the first checks of the report. The whole report, and copying or downloading it, unlock with a Pro pass.
How to use it
- Paste the token (a leading
Beareris removed), or pick an example. - Paste the key you trust: the shared secret for HS256/384/512 (and say whether it is text, Base64 or hex), or the issuer’s public key as PEM, a certificate, a JWK or the whole JWK Set from its
jwks_uri. - Set the rules your application uses: the allowed algorithms, the expected issuer and audience, the type, the clock skew, whether
expis required and the maximum age. - Read the verdict and the checks, worst first in each group. With a pass or after unlocking this result, copy or download the report.
Examples
eyJhbGciOiJSUzI1NiIsImtpZCI6… · the provider’s JWK Set · issuer https://login.example.com/ · audience api://orders
Valid: the RS256 signature checks out with the key whose kid matches, the issuer and audience match, it expires in 52 min
A token with "alg": "HS256" checked with the server’s RSA public key
Algorithm confusion: an HS token must never be verified with a public key — rejected before any signature check
An HS256 token signed with the secret "secret"
Signature valid, but rejected: 6 bytes is shorter than the 32 bytes RFC 7518 §3.2 requires, and the secret looks human-made (RFC 8725 §3.5)
Common uses
- Debugging "invalid signature" or "jwt expired" errors between an identity provider and your API.
- Checking that your own token issuer sets the algorithm, kid, issuer, audience, type and expiry that verifiers expect.
- Testing a JWT library or gateway configuration against the RFC 8725 attacks (alg none, algorithm confusion, weak secrets, jku).
- Seeing which key in a JWKS a token was signed with, and spotting a key rotation the verifier has not picked up.
What a careful verifier checks
- The algorithm: accept only the algorithms you expect for your key, never whatever the header says (RFC 8725 §3.1); reject
none(RFC 8725 §3.2, RFC 7518 §3.6). - The key: the issuer’s key, chosen by
kidfrom its JWK Set, of the right type for the algorithm and not marked for another algorithm or for encryption (RFC 7517 §4.2–4.4). - The signature over the first two parts, exactly as sent (RFC 7515 §5.2).
- Time:
expin the future andnbfin the past, allowing a small clock skew;iatnot in the future (RFC 7519 §4.1.4–4.1.6). - Who:
issis the issuer you expect and the key belongs to it (RFC 8725 §3.8);audnames your service (RFC 8725 §3.9). - What kind: an explicit
typsuch asat+jwtkeeps an ID token from being used as an access token (RFC 8725 §3.11, RFC 9068).
Attacks the checks catch
- alg: none — an unsigned token that a careless library accepts.
- Algorithm confusion — a token switched from RS256 to HS256 and signed with the server’s public key as the HMAC secret; a verifier that takes the algorithm from the token accepts it (RFC 8725 §2.1).
- Weak secrets — HS256 needs at least 256 bits (RFC 7518 §3.2); a word or a short password can be guessed offline from a single token, and RFC 8725 §3.5 forbids human-memorable passwords as HMAC keys.
- Keys from the token —
jku,x5u,jwkandx5clet a token point to or carry its own key; following them blindly lets an attacker supply the key (RFC 8725 §3.10). - kid injection — a kid such as
../../dev/nullor one with SQL in it attacks key lookups that trust it (RFC 8725 §3.10). - Unknown crit — a token that marks a header parameter as critical must be rejected when the verifier does not understand it (RFC 7515 §4.1.11).
When a valid-looking token fails
- Invalid signature with HS256: the secret is often meant as Base64 (its decoded bytes) while you typed it as text, or the other way round — the page tries both and says which matches — or a line break was copied with it.
- Invalid signature with RS256/ES256: the issuer rotated its keys and the kid points to a new one; fetch its JWK Set again. An ES256 signature of about 70 bytes is DER, which JWS does not allow (RFC 7518 §3.4 requires 64 raw bytes).
- Expired, not valid yet or issued in the future: compare the device clocks; a minute or two of skew is normal.
- Wrong audience or issuer: they are compared exactly, so
https://login.example.comandhttps://login.example.com/differ.
Limitations
- Signed tokens only (JWS compact form): encrypted JWE tokens are recognised but not decrypted. Detached and JSON-serialized JWS are not read.
- ES256K (secp256k1) and Ed448 cannot be checked in browsers; EdDSA needs Ed25519 support in Web Crypto (current browsers).
- The page never fetches keys: paste the JWK Set from the issuer’s jwks_uri yourself. It checks the key you give, not whether that key really belongs to the issuer.
- Times are checked against your device clock unless you choose another time; nested JWTs (cty "JWT") are pointed out, not opened.
Privacy
On this device: nothing is sent
Your token, secret and keys are checked only in this tab with your browser’s Web Crypto: nothing is uploaded, logged or stored. Treat live tokens and secrets as passwords anyway — they work until they expire.
Frequently asked questions
What do I get without a pass?
Without a pass, JWT Signature Verifier shows the verdict and every count, the token’s decoded header and claims, and the first checks of the report (up to 10). Until you unlock it, the result can’t be downloaded or copied. A Pro, Premium or Ultimate pass, a one-time payment that never renews, unlocks the full result. The pricing page lists the passes and their prices.
What is the difference between this and a JWT decoder?
A decoder (like the JWT Decoder) shows the header and claims, which anyone can write. This page proves who signed them and checks them against your rules — algorithm, key, issuer, audience, time — and against the attacks of RFC 8725.
Which key do I paste for a token from Google, Microsoft, Auth0 or Okta?
Their public JWK Set: open the issuer’s /.well-known/openid-configuration, follow jwks_uri, and paste the whole {"keys":[…]}. The page picks the key whose kid matches the token’s header.
Why does my HS256 token fail although the secret is right?
Usually the secret’s encoding: some systems use the Base64-decoded bytes of the secret, others its text. Switch the encoding (the page also tries the others and tells you when one matches). A space or line break copied with the secret also breaks it.
How much clock skew should I allow?
A small amount — commonly 30 to 120 seconds — covers clocks that are slightly off without keeping expired tokens alive for long. The page uses 60 seconds unless you change it.
Is it safe to paste a production token here?
The check runs in your browser and nothing is sent anywhere. Still, a token is a bearer credential until it expires: prefer test tokens, and do not paste tokens into tools you do not trust.