JWT Decoder

Paste a JSON Web Token to decode its header and payload. Decoding happens entirely in your browser.

Runs 100% in your browser. Nothing you paste here is ever sent to a server. Don't take our word for it — open your browser's DevTools (F12) → Network tab, use the tool, and watch: no new requests fire. Why that matters.

What is a JWT?

A JSON Web Token is a compact, URL-safe token made of three Base64URL-encoded parts separated by dots: a header (algorithm and token type), a payload (the claims — user ID, expiry, roles, etc.), and a signature that proves the token wasn't tampered with. Anyone can decode the header and payload without a secret key — that's by design, JWTs aren't encrypted, they're signed. Never put secrets in a JWT payload.

This tool doesn't verify signatures

Decoding shows you what's inside the token. It does not verify the signature is valid, since that requires the issuer's secret or public key. Don't trust the contents of a JWT you haven't verified server-side — a decoded payload could belong to a token that's expired, revoked, or was never validly signed in the first place.

The 'alg: none' trap and expiry claims

A known class of JWT vulnerabilities involves attackers changing the header's algorithm to none and stripping the signature entirely; poorly-written verification code that doesn't explicitly check the expected algorithm can be tricked into accepting it as valid. Separately, the exp (expiry) and iat (issued-at) claims are Unix timestamps in seconds (not milliseconds) — a common bug when comparing them against JavaScript's millisecond-based Date.now() in your own verification code.

Frequently asked questions

Can anyone read the contents of my JWT?

Yes — JWTs are signed, not encrypted, so the header and payload are plain Base64URL-encoded JSON that anyone can decode without any secret. Never store passwords, API keys, or other secrets directly in a JWT payload.

Does this tool verify the token's signature?

No. It only decodes and displays the header and payload. Verifying the signature requires the issuer's secret or public key and should happen server-side, not in a client-side decoder.

Why shouldn't I trust an expired token's payload?

The exp claim is only meaningful if you actually check it against the current time during verification. A decoder just shows you what's there — it doesn't tell you whether the token is still valid, so treat the decoded contents as informational only.

Other tools