JWT Decoder Online — Free JSON Web Token Debugger

Decode a JWT's header and payload, check expiry at a glance, and optionally verify an HS256 signature — entirely in your browser. Nothing you paste here is ever sent anywhere.

JSON Web Token
// Decoded header appears here
// Decoded payload appears here

Verify Signature (HS256 only)

Computed locally via Web Crypto HMAC-SHA256 — the secret is never transmitted anywhere.

What is a JWT Decoder?

A JWT (JSON Web Token, RFC 7519) packs a header and a set of claims into two Base64URL-encoded JSON objects, joined with a signature: header.payload.signature. A JWT decoder reverses the Base64URL encoding to show you the readable JSON underneath — no key required, because the payload is only signed, not encrypted. This tool decodes both segments instantly and, if you provide the shared secret, verifies an HS256 signature too.

Because JWTs are so widely used for session tokens, API auth, and SSO, decoding one is one of the most common quick-debugging tasks in web development — checking why a token was rejected usually starts with looking at its exp claim or its alg.

How to decode a JWT — 3 steps

  1. Paste the token. The tool splits it on its two dots into header, payload, and signature.
  2. Read the decoded JSON. Header shows the algorithm and token type; payload shows every claim, with exp/iat/nbf converted to a human-readable UTC date automatically.
  3. Optionally verify. For HS256 tokens, paste the shared secret and click Verify to confirm the signature actually matches — decoding alone does not prove the token wasn't tampered with.

Expiry At A Glance

exp, iat, and nbf are converted to readable UTC timestamps automatically, with an expired/valid badge — no manual epoch-to-date conversion.

Real HS256 Verification

Not just decoding — provide the shared secret and this tool recomputes the HMAC-SHA256 signature via Web Crypto to confirm it actually matches.

Nothing Leaves The Tab

Decoding and verification both run in JavaScript, in your browser. Your token and secret are never transmitted, logged, or stored.

Decoding vs. verifying — the distinction that matters

Anyone can decode a JWT — the header and payload are plain Base64URL, not encrypted, so pasting one into any decoder (this one, jwt.io, or a one-line script) reveals every claim with no key needed. That is exactly why JWTs should never carry secret data in the payload. Verification is the separate, security-relevant step: it proves the token was issued by whoever holds the signing key and has not been modified since. This tool verifies symmetric HS256 tokens directly; asymmetric algorithms (RS256, ES256) need the issuer's public key, which typically lives at a JWKS endpoint your backend library fetches — not something a client-side decoder can safely do on your behalf.

Common use cases

  • check_circleDebugging why a backend is rejecting a token — checking exp, iss, and aud claims
  • check_circleInspecting an OAuth/OIDC access or ID token during SSO integration work
  • check_circleConfirming a locally-issued test JWT actually contains the roles/scopes you expect
  • check_circleVerifying an HS256 webhook or internal service token against a shared secret
  • check_circleChecking the alg header to confirm a token isn't using the deprecated "none" algorithm
  • check_circleComparing iat vs exp to sanity-check a token's configured lifetime

Working with tokens and hashes?

Pair the JWT decoder with the HMAC and hash tools — all computed locally via Web Crypto.

Frequently Asked Questions

What is a JWT?

A JSON Web Token (RFC 7519) is a compact, URL-safe token format for representing claims between two parties. It has three Base64URL-encoded segments separated by dots: a header (algorithm and token type), a payload (the claims — e.g. user ID, expiry, roles), and a signature (proves the header and payload were not tampered with, if you hold the signing key).

Is decoding a JWT the same as verifying it?

No. Decoding just Base64URL-decodes the header and payload — anyone can do this without any key, because JWTs are signed, not encrypted, and the claims are plainly readable to anyone who has the token. Verifying checks the signature against the correct key, proving the token was issued by a party who holds the signing secret and has not been altered since. Never trust claims from a decoded-but-unverified token in a security-sensitive context.

Why can this tool only verify HS256 tokens?

HS256 (HMAC-SHA256) is symmetric — the same secret both signs and verifies, so a client-side tool can check it with just the shared secret. RS256, ES256, and other asymmetric algorithms sign with a private key and verify with a public key; verifying those requires the issuer's public key (usually published at a JWKS endpoint), which this tool does not fetch. For asymmetric algorithms, use your backend JWT library or a tool that accepts a public key/JWKS URL.

What do the exp, iat, and nbf claims mean?

All three are Unix timestamps (seconds since epoch), per RFC 7519 §4.1: exp (expiration time) — the token must be rejected after this instant; iat (issued at) — when the token was created; nbf (not before) — the token must be rejected before this instant. This tool converts exp/iat/nbf to human-readable UTC dates automatically and flags an exp in the past as expired.

Is it safe to paste a real production JWT or secret into this tool?

Decoding and verification both run entirely in your browser via client-side JavaScript and the Web Crypto API — nothing you paste here, including the signing secret, is ever transmitted to any server. That said, treat any JWT holding real session data as a credential: if you're debugging a token from a shared or production environment, prefer a redacted copy or a locally-issued test token where practical.

Why does my token fail to decode?

The most common causes: the string isn't a JWT at all (JWTs always have exactly two dots — three segments); it was truncated when copied (check for a cut-off signature); or it's an encrypted JWE, not a signed JWS — JWEs have five segments instead of three and contain ciphertext, not a plain Base64URL-encoded JSON payload, so they cannot be decoded the same way.