Free JWT Decoder — Inspect JSON Web Tokens in Your Browser
This is a free online JWT decoder that splits any JSON Web Token into its three parts — header, payload, and signature — and pretty-prints the decoded JSON the moment you paste. Standard claims like exp, iat, and nbf are humanised into relative phrases (“expires in 2 hours”, “issued 40 seconds ago”) so you don’t have to convert Unix timestamps by hand just to check whether a token is still valid.
Everything happens locally. The token is split on dots and base64url-decoded with plain JavaScript — no external libraries, no network calls, nothing sent to a server, nothing logged. You can disconnect from the internet after the page loads and the decoder keeps working, which matters when you’re inspecting a token you’d rather not paste into a third-party service.
What is a JSON Web Token?
A JWT is a compact, URL-safe credential that carries a JSON payload plus a cryptographic signature. It’s the format most modern APIs, single-sign-on systems, and microservices use to pass authentication and authorisation data around. A JWT has exactly three base64url-encoded parts separated by dots:
- Header — a small JSON object that declares the signing algorithm (
alg) and token type (typ). Common algorithms includeHS256(HMAC-SHA256),RS256(RSA), andES256(ECDSA). - Payload — the claims. Standard claims include
iss(issuer),sub(subject / user id),aud(audience),exp(expiration),iat(issued at), andnbf(not before). Applications add their own custom claims likerole,scope, ortenant_id. - Signature — the output of the signing algorithm applied to the first two parts. This is what lets a server verify a token without needing a session lookup.
The three parts are joined with dots (header.payload.signature). The dots make JWTs trivial to split and decode — which is why every JWT decoder, including this one, can read the header and payload of any token without any key.
Decoding ≠ verifying (important)
This tool, like every browser-based JWT decoder, does not verify the signature. Verification requires the issuer’s secret (for HMAC algorithms) or public key (for RSA/ECDSA), and neither is available to a generic decoder. That’s not a limitation — it’s how JWTs are designed to work:
- Anyone can decode a JWT. The payload is readable by design. If you don’t want a value visible, don’t put it in a signed JWT — use a JWE (encrypted JWT) or store the data server-side and put only an opaque reference in the token.
- Only the key-holder can verify or issue one. Verification belongs on your server, using a library that checks the signature against the correct secret or public key and rejects the token if anything is off.
A decoded payload is not a verified payload. Never trust the claims from a JWT your server hasn’t validated — the payload you see in this decoder could have been crafted by anyone with base64 skills.
How to use this JWT decoder
- Paste your token into the input box. It should look like
eyJhbGciOi….
Click Load sample if you just want to see what a decoded JWT looks like. - The three panels update instantly:
- Header — algorithm and token type.
- Payload — all claims, plus a separate “Standard Claims” section that humanises
iat,exp, andnbf. - Signature — the raw base64url-encoded signature bytes (not verified).
- Use the Copy button on any panel to grab the decoded JSON for a bug report, a gist, or a unit test fixture.
The standard claims you’ll see most often
These are defined in RFC 7519 and are the ones this decoder pays special attention to:
iss— issuer. Who minted the token. Usually your auth server’s URL.sub— subject. Who the token is about. Typically a user ID.aud— audience. Which service the token is intended for. Servers must reject tokens addressed to someone else.exp— expiration. Unix timestamp after which the token is invalid. Shown here as “expires in X” or “expired X ago”.iat— issued at. When the token was minted.nbf— not before. Token is invalid until this instant.jti— JWT ID. A unique identifier for the token, useful for revocation lists.
Common use cases
- Debugging “401 Unauthorized” — paste the token your client is sending and check whether
exphas passed oraudmatches what the server expects. - Verifying SSO tokens — confirm the
iss,sub, andscopeclaims match what your identity provider should be emitting. - Auditing permission scopes — look at custom claims like
roles,permissions, ortenant_idto check what a token authorises. - Teaching and documentation — use the “Load sample” button to show a colleague the structure of a JWT without handing them a real one.
- Inspecting third-party tokens — see what’s inside a JWT returned by Auth0, Okta, AWS Cognito, Firebase, Supabase, Keycloak, or a custom OAuth 2.0 provider.
JWS vs. JWE — which does this decoder handle?
When people say “JWT” they almost always mean JWS (JSON Web Signature) — a signed token with a readable payload. That’s what this tool decodes. A JWE (JSON Web Encryption) is an encrypted JWT with five dot-separated parts and an unreadable payload unless you hold the decryption key; JWE tokens are less common outside specific enterprise and healthcare integrations, and this decoder does not attempt to process them. If your token has five dots instead of two, it’s a JWE and you’ll need the decryption key in your own code to read it.
A note on alg: "none"
Some tokens declare "alg": "none" in the header, which means the token is unsigned. This was the source of a well-known class of vulnerabilities: attackers would take a valid token, change the algorithm to none, strip the signature, and libraries that didn’t filter algorithms would accept the forged token as valid. Every well-maintained JWT library now rejects alg: "none" by default. If you see it in a token from an external source, treat that token as completely unauthenticated — anyone could have produced it.
Is it safe to paste a production token here?
The decoding itself is safe — your token never leaves your browser. But a live JWT is, in most systems, a bearer credential: whoever holds it can impersonate the user until it expires. Treat production tokens like passwords. Prefer pasting expired tokens, sample tokens, or tokens from a staging environment when you’re debugging. If you must paste a live production token, revoke it (log the user out, rotate the session) as soon as you’re done. This advice applies to every JWT decoder, including the ones that claim to be “secure”.
Privacy and offline use
All decoding happens locally with the browser’s built-in atob and JSON.parse — there are no external libraries, no fetch calls, no analytics hooks on the token input. Once the page has loaded, you can disconnect from the internet and keep decoding. Nothing about your token is ever logged, cached on a server, or sent to a third party.