JWT Decoder

Decode and inspect JSON Web Tokens (JWTs) securely in your browser

Please enter a valid JWT token.

Header

Decoded

Payload

Decoded

Token Details

Issuer (iss)

-

Issued At

-

Expiration

-

Algorithm

-

Status

-

Verify Signature

Fetched from issuer discovery (.well-known/openid-configuration)

Signature verification not supported for algorithm . Use HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, or ES512.

Understanding JWTs

How JSON Web Tokens work and why they're important

What is a JWT?

JWT (JSON Web Token) is an open standard for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed.

JWT Structure

JWTs consist of three parts separated by dots: header.payload.signature. The header typically contains the token type and the signing algorithm being used.

Security Best Practices

Always validate JWT signatures, check expiration times, and never store sensitive data in a JWT payload as they can be decoded (but not altered without the signature key).

Working with JSON Web Tokens

What each part of the token contains

A JWT is three base64url-encoded segments joined by dots: header.payload.signature. The header names the signing algorithm (alg) and usually a key identifier (kid). The payload carries the claims. The signature covers the first two segments exactly as they appear in the token.

Everything before the signature is encoded, not encrypted. Anyone holding the token can read the payload — including in a browser devtools panel or a server log. Never put anything in a JWT that the bearer shouldn't see. If you need confidentiality rather than integrity, you want JWE, not JWS.

Decoding is not verifying

This is the distinction that causes production incidents. Decoding parses the base64url and shows you the claims. Verifying checks the signature against a key, and confirms the token hasn't been altered and came from the issuer you expect.

A decoded-but-unverified token is attacker-controlled input. Anyone can craft a JWT with sub: "admin" and any claims they like. If your code reads claims without checking the signature, it will believe them. Always verify before you trust a single field.

The claims worth checking

iss — who issued it. Must match the issuer you configured, exactly. aud — who it's for. If it doesn't name your application or API, the token was minted for someone else and you should reject it.

exp and nbf — the validity window, as Unix timestamps in seconds (not milliseconds, a common off-by-1000 bug). iat — when it was issued, useful for enforcing a maximum age independent of exp. sub — the subject, which is the stable user identifier you should key off rather than an email address.

Frequently asked questions

Decoding and verification run entirely in your browser using the Web Crypto API — the token is never transmitted to our servers. The one exception is JWKS verification, where your browser fetches the key set directly from the issuer's URL. That said, treat any token you paste anywhere as potentially exposed, and prefer test tokens where practical.

Almost always the wrong key. If the token uses RS256 or ES256 you need the issuer's public key matching the token's kid claim, not just any key from the JWKS. Other common causes are a stale JWKS cache after key rotation, base64 vs base64url confusion, and HS256 secrets where one side uses the raw string and the other base64-decodes it first.

It declares the token is unsigned. It exists in the spec for cases where integrity is guaranteed by another layer, but in practice it is an attack: strip the signature, set alg to none, and a naive verifier accepts anything. Any serious library rejects it by default. If you see it on a token you received, treat that token as untrusted.

Not in the decoder — it reads tokens rather than mints them. Use the JWT Generator to create a token with claims you choose, signed with a secret or key you control. That's the right tool for building test fixtures.

HS256, HS384, HS512 for shared-secret HMAC, and RS256, RS384, RS512, ES256, ES384, ES512 for asymmetric signatures. RS256 is the most common for OAuth2 and OIDC providers. Tokens using an unsupported algorithm will still decode; only signature verification is unavailable.

Stop hand-rolling token validation

You just decoded that token by hand. AuthAction issues, signs, and rotates them for you — with JWKS, key rotation, and expiry handled.

Free, unlimited users. No credit card required.