Faruk ToolsVisit Portfolio

JWT Decoder

Decode a JWT's header and payload instantly, and verify its HS256, HS384, or HS512 signature with the Web Crypto API. Nothing is uploaded — no server, no logging.

Nothing leaves the browser. Every token, secret, and claim here is decoded, verified, and signed on this device with the Web Crypto API. There is no network request, no logging, and nothing is saved.

Verify signature

Checks HS256, HS384, and HS512 only — RS256/ES256 use a key pair, not a shared secret.

Paste a JWT to see its decoded header and payload here.

A JWT's header and payload are base64url-encoded JSON, not encrypted data — anyone holding the token can read both without any secret at all. Decoding a token tells you what it claims; it says nothing about whether those claims are real.

The signature is the only part that proves a token wasn't edited after it was issued. This tool decodes the header and payload instantly as you type, and separately lets you verify the HS256, HS384, or HS512 signature against the shared secret that signed it — using the same key comparison your server would run.

Everything happens in your browser with the Web Crypto API. There is no server round-trip: paste a token here and it never touches a network request, which matters if that token is a live credential.

How to use this JWT decoder

  1. 1Paste a JWT into the token field. The header and payload decode immediately — no button needed, since decoding is just reading base64url text.
  2. 2If the payload has an exp claim, the tool flags the token as expired the moment that timestamp is in the past, and shows the exact expiry time.
  3. 3To verify the signature, enter the HMAC secret that signed the token and click Verify signature. This only works for HS256, HS384, and HS512 — tokens signed with RS256 or ES256 use a public/private key pair instead of a shared secret, and this tool tells you so rather than pretending to check.
  4. 4Copy the decoded header or payload JSON with one click if you need to paste it elsewhere.

What each part of a JWT does

PartContentsTrust level
HeaderAlgorithm (alg) and token type (typ)Readable and editable by anyone — never trust it alone
PayloadClaims: sub, iss, exp, aud, and custom fieldsReadable by anyone — this is not encryption
SignatureHMAC or public-key signature over header.payloadThe only part that proves the token wasn't tampered with

Frequently asked questions

Is decoding a JWT the same as verifying it?+

No. Decoding just reverses the base64url encoding to read the header and payload as JSON — it requires no secret and proves nothing. Verifying checks the signature against the key that's supposed to have produced it, which is the only step that confirms the token is genuine and unmodified.

Does anything I paste here get sent to a server?+

No. Decoding and signature verification both run entirely in your browser using the Web Crypto API. Open your browser's DevTools Network tab, paste a token, and click Verify — the request list stays empty.

Why can't I verify an RS256 or ES256 token here?+

Those algorithms use a public/private key pair instead of a shared secret: the token is signed with a private key and verified with a separate public key, usually fetched from the issuer's JWKS endpoint. This tool only checks the shared-secret HMAC algorithms — HS256, HS384, and HS512 — where the same secret both signs and verifies.

Why does the signature check fail even though the token looks right?+

The most common cause is a mismatched secret — check for extra whitespace or the wrong environment's key. It can also happen if the payload was edited after signing, even a single character, since the signature is computed over the exact original bytes of the header and payload, not a re-serialized version of the JSON.

Is it safe to paste a real production token into a browser tool?+

Treat any JWT as a live credential until it expires — the payload is plaintext, and pasting it into an untrusted site can leak it to that site's server. This tool never makes a network request, but as a general rule, prefer a throwaway or expired token when testing a decoder you don't control, and always check that the page is running as static client-side code before trusting it with a real one.

Why does the tool say Web Crypto isn't available?+

crypto.subtle only exists in a secure context — HTTPS, or http://localhost during local development. On a plain http:// page, such as an IP address reached over your local network, the browser doesn't expose it at all, and signature verification can't run. Decoding still works either way, since it doesn't use Web Crypto.