JWT Signature Verifier

Inspect a JWT and verify its signature with an HMAC secret or a public JWK or JWKS. Add an expected issuer or audience to check those claims as well; decoding a token by itself does not verify its authenticity.

Runs locally in your browser
LOCAL CRYPTOjose 6.2.10HS · RS · PS · ES · EdDSAWeb Crypto API
JWTs, HMAC secrets, and JWK material are handled in this browser. The verifier does not fetch a JWKS URL, send a token, or retain key material after the page session.
Compact JWT
Verification material

For HS256/384/512, enter the raw shared secret. For asymmetric algorithms, paste a public JWK or JWKS JSON document.

Claims overview
Protected header and payload
Decode or verify a compact JWT to inspect its protected header and payload.

Decode is not the same as verification

Anyone can decode a JWT payload. Treat a token as trusted only after a successful signature check with the intended algorithm and key, plus issuer, audience, time, and application-level claim validation.

How to inspect and verify a token

Paste a compact JWT and the tool shows its protected header and payload, then verifies the signature with the key material you supply: a raw shared secret for HS256/384/512, or a public JWK or JWKS document for RS, PS, ES and EdDSA. An expected issuer or audience can be checked in the same run.

Decoding is not verification. The page decodes locally and says so, and it only reports a token as verified after the signature and the registered claims (exp, nbf, iss, aud) pass. Nothing is uploaded, no JWKS URL is fetched, and the key material is not stored.

  1. Paste the compact JWT into the token field. The first click loads the jose module, so the first result takes a moment.
  2. Paste the key material: the raw shared secret for HS256/384/512, or the public JWK or the JWKS document for the asymmetric algorithms. The secret field is trimmed before it is used, and its bytes are taken as UTF-8.
  3. Press Inspect token to read the header and payload without trusting them, or Verify signature to check the signature and the registered claims.
  4. Fill in Expected issuer and Expected audience when the token should be bound to them; leave them empty to skip those checks.
  5. Load local ES256 example creates an ephemeral key pair in the page, signs a token with it and verifies it, so you can see a passing run without any key of your own. Clear empties the fields.

What the verifier checks

Decoding, and what it is worth

Inspect token runs the payload through a JWT decoder and prints the protected header and the payload as JSON. The status line stays a warning on purpose: anyone who holds the token can read it, so decoded claims are only a preview of what the token claims to be.

A token that declares no signed algorithm (alg none or missing) still decodes here, because inspection never requires a signature. Verify signature is the check that refuses it.

The checks behind Verify signature

With a shared secret, the signature is recomputed over the exact token text and compared; with a public key, the corresponding JWK is imported and used. A JWKS document is searched for the key whose kid matches the token header, falling back to the first key when the token carries no kid.

The registered claims are checked in the same run: exp and nbf against the current clock, iss against the expected issuer and aud against the expected audience when those fields are filled in. The status line names the first failure — signature verification failed, an exp or nbf timestamp check, an unexpected or missing iss or aud value — instead of a generic error.

The claims summary and the raw output

The overview lists Algorithm, Key ID, Issuer, Audience, Subject and Expires; an audience array is printed as a comma-separated list. The panel underneath is the decoded token as pretty-printed JSON, with protectedHeader and payload in one document.

Both panels are read-only text: the result can be selected and copied, and a verified run keeps the same layout as an inspection, so nothing hides the fact that the signature is the part that makes the claims trustworthy.

Where the keys live

Everything happens in the tab with the jose library and the Web Crypto API. The page makes no request while inspecting or verifying, it never fetches a JWKS URL — you paste the document — and the key material stays in the form fields.

The example button is the only place a private key exists, and it never leaves the page: the key pair is generated in the browser, the token is signed there, and the field is filled with the public JWK only. That also means key rotation is manual here: a rotated JWKS has to be pasted again.

Recent tools: