April 2, 2026 · 7 min read · Free Tool

Free JWT Decoder Online — Decode & Inspect JSON Web Tokens

Paste a JWT, instantly see header, payload, and claims. Check expiration, algorithm, and issuer — all without sending your token anywhere.

What Is a JWT?

A JSON Web Token (JWT) is a compact, URL-safe way to represent claims between two parties. It's the most common authentication token format in modern web development — used by Auth0, Firebase, Supabase, AWS Cognito, and nearly every OAuth 2.0 provider.

A JWT looks like this:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

That's three Base64URL-encoded parts separated by dots:

  1. Header — algorithm and token type
  2. Payload — claims (user data, expiration, permissions)
  3. Signature — verification hash

JWT Structure Explained

Header

{
  "alg": "HS256",
  "typ": "JWT"
}

The header tells you which algorithm was used to sign the token. Common algorithms:

AlgorithmTypeKeyUse Case
HS256HMACShared secretSimple apps, single server
HS384/HS512HMACShared secretHigher security symmetric
RS256RSAPublic/private pairDistributed systems, OAuth
RS384/RS512RSAPublic/private pairHigh security RSA
ES256ECDSAPublic/private pairModern apps, smaller keys
EdDSAEdDSAPublic/private pairNewest, fastest asymmetric

Security tip: Never accept "alg": "none" in production. This disables signature verification entirely — a classic JWT attack vector.

Payload (Claims)

{
  "sub": "user_123",
  "name": "Alice",
  "email": "alice@example.com",
  "role": "admin",
  "iat": 1712016000,
  "exp": 1712102400,
  "iss": "https://auth.example.com"
}

Claims are the data inside the token. There are three types:

Registered Claims (Standard)

ClaimFull NamePurpose
issIssuerWho created the token
subSubjectWho the token is about (usually user ID)
audAudienceWho the token is intended for
expExpirationWhen the token expires (Unix timestamp)
nbfNot BeforeToken not valid before this time
iatIssued AtWhen the token was created
jtiJWT IDUnique identifier for the token

Public Claims

Custom claims registered in the IANA JWT Claims Registry: name, email, email_verified, picture, etc.

Private Claims

Your custom claims: role, permissions, tenant_id, plan — anything your application needs.

Why Decode JWTs?

Common debugging scenarios:

What Our JWT Decoder Does

Our free JWT decoder gives you:

⚠️ Never paste production tokens into online tools that send data to a server. Our decoder runs entirely in JavaScript — check the source yourself.

Decoding JWTs in Code

JavaScript (No Library)

function decodeJWT(token) {
  const parts = token.split('.');
  return {
    header: JSON.parse(atob(parts[0])),
    payload: JSON.parse(atob(parts[1]))
  };
}

// Check expiration
function isExpired(token) {
  const { payload } = decodeJWT(token);
  return payload.exp < Math.floor(Date.now() / 1000);
}

Node.js (jsonwebtoken)

const jwt = require('jsonwebtoken');

// Decode without verification
const decoded = jwt.decode(token, { complete: true });
console.log(decoded.header);  // { alg: 'RS256', typ: 'JWT' }
console.log(decoded.payload); // { sub: '123', name: 'Alice', ... }

// Verify and decode
try {
  const verified = jwt.verify(token, publicKey);
} catch (err) {
  console.log('Invalid:', err.message);
}

Python (PyJWT)

import jwt

# Decode without verification
payload = jwt.decode(token, options={"verify_signature": False})

# Verify and decode
try:
    payload = jwt.decode(token, public_key, algorithms=["RS256"])
except jwt.ExpiredSignatureError:
    print("Token expired")
except jwt.InvalidTokenError:
    print("Invalid token")

Go

import "github.com/golang-jwt/jwt/v5"

token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
    return publicKey, nil
})
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
    fmt.Println(claims["sub"])
}

JWT Security Best Practices

  1. Always verify signatures. Decoding ≠ verifying. Anyone can create a JWT with any payload.
  2. Use short expiration times. 15-60 minutes for access tokens. Use refresh tokens for longer sessions.
  3. Don't store sensitive data in JWTs. The payload is only Base64-encoded, not encrypted. Anyone can decode it.
  4. Validate iss and aud claims. Prevent tokens from one service being used in another.
  5. Use asymmetric algorithms (RS256, ES256) in distributed systems so services can verify without knowing the signing key.
  6. Reject alg: "none". Always.
  7. Rotate signing keys regularly. Use JWKS (JSON Web Key Set) for key rotation.

JWT vs Session Cookies vs API Keys

FeatureJWTSession CookieAPI Key
StatelessYesNo (server stores session)Yes
Self-containedYes (claims inside)No (ID only)No
ExpirationBuilt-in (exp)Server-controlledManual
RevocationHard (need blocklist)Easy (delete server-side)Easy (delete key)
Size~800 bytes typical~32 bytes (session ID)~32-64 bytes
Cross-domainEasy (Authorization header)Hard (CORS, SameSite)Easy

Try It Free

Paste any JWT and instantly see the decoded header, payload, and expiration status. Your token never leaves your browser.

🔑 Free JWT Decoder

Decode, inspect, and debug JSON Web Tokens — all client-side, all free.

Open JWT Decoder →

More Free Dev Tools