Skip to main content
Developer Tools Developer Tools · Security

JWT Decoder

Decode JWT header, payload, and claims instantly with expiry status — decoding only, no signature verification. Runs in your browser.

Calculator

Decoding happens in your browser — the token is not stored. Avoid pasting live production tokens anywhere, including here.

Decoding is not verification

This tool ONLY decodes JWTs so you can read their contents. It DOES NOT verify the signature and DOES NOT validate authenticity. Never use a decoded result to decide whether a token is trusted — anyone can forge a token that decodes cleanly. Trust requires signature verification against the issuer’s key on your server.

How JWT Decoder Works

What is a JWT?

A JSON Web Token (JWT, pronounced “jot”) is a compact, URL-safe format for transmitting claims between two parties — most commonly used to represent an authenticated user in web APIs. A JWT is a single string made of three Base64URL-encoded segments separated by dots: header.payload.signature. Once issued, the header and payload are easy to read by anyone — they are encoded for transport, not encrypted for secrecy.

Security Warning: Decoding Is Not Verification

This tool ONLY decodes JWTs. It DOES NOT verify signatures. It DOES NOT validate authenticity. Decoding a JWT tells you what a token claims — it tells you nothing about whether those claims are genuine. Anyone can construct a JWT with any header and payload they like; it will decode perfectly here and look completely legitimate. The only way to know a JWT can be trusted is to verify its signature against the issuer’s secret or public key, performed server-side with a proper JWT library. Never use the output of this tool, or any JWT decoder, to make a trust or authorization decision.

JWT Structure

SegmentEncodingContains
HeaderBase64URL JSONAlgorithm (alg) and token type (typ)
PayloadBase64URL JSONClaims — registered, public, and private/custom
SignatureAlgorithm-specificProof of integrity — verifiable only with the issuer’s key

Header

A minimal header looks like {"alg": "HS256", "typ": "JWT"}. The alg field names the signing algorithm — commonly HS256 (a shared secret) or RS256/ES256 (public/private key pairs). A well-known attack sets alg to none, effectively removing the signature — this is why every JWT library must be configured with an explicit allow-list of accepted algorithms, never trusting the algorithm the token itself claims to use.

Payload

The payload holds claims — key/value statements about the token. Use the JSON Formatter if you want to reformat a raw payload you’ve copied out, or the JSON Validator to check hand-edited JSON claims before re-encoding them.

Signature

The signature is computed over the header and payload using the algorithm named in the header and a key only the issuer holds. It exists so a verifier can detect any change to the header or payload — but computing or checking that signature is a cryptographic operation this decoder deliberately does not perform, because doing so safely requires the issuer’s key, which this browser-only tool never has and should never be given.

Registered Claims (RFC 7519)

ClaimNameMeaning
issIssuerWho issued the token
subSubjectWho the token is about (usually a user ID)
audAudienceWho the token is intended for
expExpirationUNIX timestamp after which the token is invalid
nbfNot BeforeUNIX timestamp before which the token is not yet valid
iatIssued AtUNIX timestamp when the token was created
jtiJWT IDUnique identifier for this token, often used to prevent replay

Everything else in the payload is a custom (private) claim — application-specific data like role, tenant_id, or permissions. This tool decodes and displays both registered and custom claims, and converts iat/nbf/exp into readable UTC dates with plain-language remaining time or elapsed-since-expiry.

Common JWT Mistakes

  • Storing sensitive data in the payload. The payload is readable by anyone with the token — never put passwords, secrets, or sensitive PII in a JWT claim.
  • Trusting a decoded token without verifying the signature. The single most dangerous JWT mistake — see the Security Warning above.
  • Accepting the alg the token claims. Always configure your verifier with an explicit allowed-algorithms list; never let the token dictate how it should be checked.
  • No expiration claim. A JWT without exp is valid forever once issued — set a reasonably short expiry and use refresh tokens for longer sessions.
  • Confusing encoding with encryption. Base64URL is trivially reversible, not a security mechanism — anyone can decode a JWT's header and payload instantly, exactly as this tool does.

Signature Verification vs. Decoding

Decoding (this tool)Signature Verification
What it doesReads header + payload JSONCryptographically confirms the token wasn’t tampered with
RequiresNothing — Base64URL is reversible by designThe issuer’s secret or public key
Where it belongsDebugging, inspection, learningEvery server-side authentication and authorization check
Proves authenticity?NoYes, if done correctly

Use this decoder to debug why a token looks wrong, inspect what an API is sending, or learn JWT structure. Use a proper server-side JWT library (with signature verification enabled and an explicit algorithm allow-list) for every decision that depends on whether a token can be trusted.

Accuracy & Sources

Last reviewed: July 2026. Formula source: RFC 7519 (JSON Web Token) and RFC 7515 (JWS Base64URL encoding). All calculations run in your browser. No data is sent to any server.

Frequently Asked Questions

No. This tool ONLY decodes the header and payload — it DOES NOT verify signatures and DOES NOT validate authenticity. A JWT's header and payload are Base64URL-encoded, not encrypted, so decoding them requires no key and proves nothing about whether the token is genuine. Never use a decoded result to decide whether to trust a token — that requires signature verification against the issuer's key, performed server-side.

Decoding runs entirely in your browser — the token is never sent to a server or stored. That said, treat any token as sensitive: avoid pasting live production tokens into any online tool, including this one, since a JWT's payload is fully readable by whoever holds it. When JavaScript is unavailable the form falls back to a transient server-side decode that is not stored or logged, but the browser path is the safer default.

This tool checks the exp (Expiration) claim against the current time and shows 'Expired' with how long ago it expired, 'Valid (Unverified)' with time remaining, or 'Not Yet Active' if the nbf (Not Before) claim is in the future. If a token has no exp claim, it never expires by design — a common but risky configuration.

The header names the signing algorithm (alg) and token type (typ). The payload holds claims — registered ones like sub, exp, and iss, plus any custom claims the issuer adds. The signature is a cryptographic value computed over the header and payload using the issuer's key; it lets a verifier detect tampering but can only be checked with that key, which this decoder never has or requests.

The most common causes: the string doesn't have exactly three dot-separated segments, one segment isn't valid Base64URL (stray characters, wrong padding), or a decoded segment isn't valid JSON. Check that you copied the complete token including all three parts, with no extra whitespace or line breaks introduced by copy-paste.

Custom (or private) claims are any payload fields outside the seven RFC 7519 registered claims (iss, sub, aud, exp, nbf, iat, jti) — things like role, tenant_id, or permissions that an application adds for its own use. This tool separates registered claims into a table with human-readable dates and shows custom claims as their own JSON block.

The header and payload can be trivially edited by anyone, since they're only Base64URL-encoded — but doing so invalidates the signature, and any server that properly verifies signatures will reject the tampered token. This is exactly why signature verification (not decoding) is what makes a JWT trustworthy: the decoding step this tool performs cannot detect tampering on its own.