JWT Decoder — Decode Any JWT Token Instantly

Paste your JWT token above and decode it in one click. The header, payload, and signature are rendered as readable JSON — no server calls, no login, no data ever leaves your browser.

✓ 100% Client-Side ✓ All Algorithms Supported ✓ Expiry Detection ✓ Bearer Token Ready ✓ Free Forever
JWT Decoder
Paste a JWT token and click Decode
Decoded Output
Awaiting valid token...
HEADER
— waiting —
PAYLOAD
— waiting —
SIGNATURE
— waiting —

What Is a JWT Token? A Plain-English Explanation

A JSON Web Token (JWT, pronounced "jot") is a compact, self-contained string that securely carries information between two parties. You see them constantly in modern web development — they are the tokens returned when you log in, the bearer tokens attached to every API request, and the access tokens your OAuth provider hands you after authorization.

A JWT is made of three Base64url-encoded sections joined by dots. There is no encryption by default — the data is encoded, not hidden. That is why a JWT decoder can read the contents instantly, without any secret key.

The Three Parts of a JWT

1. Header — Describes the token type and the signing algorithm used. After decoding, it looks like {"alg":"HS256","typ":"JWT"}. The algorithm could be symmetric (HS256, HS512) or asymmetric (RS256, ES256, PS256).

2. Payload — The meat of the token. Contains claims: key-value pairs that assert facts about the user or session. Standard claims include sub (user ID), exp (expiry timestamp), iat (issued-at), iss (issuer), and aud (audience). Your app can add any custom claims it needs.

3. Signature — A cryptographic hash of the header and payload, created with a secret key or private key. It guarantees the token has not been tampered with. You cannot verify the signature client-side without the key — but you can always read the header and payload.

Quick Fact Every JWT starts with eyJ — that is Base64url for the opening {" of the JSON header object. If your token starts with anything else, it is likely not a standard JWT.

How to Decode a JWT Token Online — Step by Step

  1. 1
    Get your JWT token Find it in your API response, browser DevTools (Application → Local Storage or Cookies), Authorization header, or your auth provider's dashboard. It is three Base64url strings separated by dots.
  2. 2
    Paste it into the input panel Copy the entire token — including all three parts and both dots — and paste it into the input area at the top of this page. If it is a bearer token, paste everything after Bearer .
  3. 3
    Click Decode Press the Decode button (or hit Ctrl+Enter). The JWT parser immediately splits the token and displays the header and payload as colour-coded JSON.
  4. 4
    Read your claims Inspect the decoded output. Unix timestamps like exp and iat are automatically converted to human-readable dates. Check the algorithm, user ID, roles, permissions, and any custom claims your application sets.

Standard JWT Claims Explained

When you decode a JWT token, the payload contains claims. Here are the registered claims defined by RFC 7519 that you will encounter most often:

Claim Full Name Description Example Value
sub Subject Unique identifier for the user or entity the token represents "1234567890"
iss Issuer Who created and signed the token (e.g. your auth server domain) "https://auth.example.com"
aud Audience Intended recipient — the API or service that should accept the token "api.example.com"
exp Expiration Time Unix timestamp after which the token must not be accepted 1893456000
iat Issued At Unix timestamp when the token was created 1516239022
nbf Not Before Token must not be accepted before this timestamp 1516239022
jti JWT ID Unique identifier for the token, used to prevent replay attacks "abc123-xyz"

JWT Decode vs JWT Decrypt — What Is the Difference?

This is the question developers ask most often, and the confusion is completely understandable. The words decode and decrypt sound interchangeable, but they describe fundamentally different operations when it comes to JWT tokens.

Decoding reverses Base64url encoding. Because standard JWTs are only encoded — not encrypted — anyone who holds the token string can decode and read the payload. The signing signature on a JWT proves the token has not been tampered with, but it does not hide the payload from view.

Decryption applies to JWE (JSON Web Encryption) tokens. In a JWE, the payload is genuinely encrypted using a key, and it cannot be read without that key. JWEs are much less common than standard signed JWTs and require a different tool and the corresponding decryption key.

PropertyJWT (JWS — Signed)JWE (Encrypted)
Payload visible?Yes — Base64url onlyNo — encrypted
Key required to read?NoYes
Tamper-proof?Yes (signature)Yes (AEAD)
Common in auth flows?Very commonRare
This tool supports it?✓ Yes✗ No

Important Because the JWT payload is only encoded — not encrypted — never store sensitive data like passwords, credit card numbers, or private keys inside a JWT claim. Treat the payload as public information.

How to Decode a JWT in Code — Language Examples

Our online JWT parser is the quickest way to inspect a token, but sometimes you need to decode a JWT programmatically inside your application. Here are concise examples for the most popular languages.

JavaScript — No Library
function decodeJWT(token) {
  const [,payload] = token.split('.');
  const b64 = payload
    .replace(/-/g, '+')
    .replace(/_/g, '/');
  return JSON.parse(atob(b64));
}
JavaScript — jwt-decode npm
// npm install jwt-decode
import { jwtDecode } from 'jwt-decode';
 
const decoded = jwtDecode(token);
console.log(decoded.sub);
console.log(decoded.exp);
Python — PyJWT
# pip install PyJWT
import jwt
 
decoded = jwt.decode(
  token,
  options={
    "verify_signature": False
  }
)
print(decoded["sub"])
PHP
// composer require firebase/php-jwt
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
 
$decoded = JWT::decode(
  $token,
  new Key($secret, 'HS256')
);
React Hook
import { jwtDecode } from 'jwt-decode';
import { useMemo } from 'react';
 
function useJWT(token) {
  return useMemo(() =>
    token ? jwtDecode(token) : null,
    [token]
  );
}
Python — Manual (No Library)
import base64, json
 
def decode_jwt(token):
  part = token.split(".")[1]
  pad = part + "=" * (-len(part) % 4)
  return json.loads(
    base64.urlsafe_b64decode(pad)
  )

Tip For production applications, always use a well-maintained library (PyJWT, jsonwebtoken, php-jwt) rather than manual Base64 decoding. Libraries handle edge cases, padding issues, and also give you signature verification — which manual decoding does not.

Supported JWT Algorithms

This JWT decoder works with tokens signed by any algorithm. Here is a quick reference for what you will see in the alg field of the decoded header:

AlgorithmTypeKey TypeCommon Use Case
HS256HMAC + SHA-256Shared secretSingle-server apps, microservices with shared secret
HS384 / HS512HMAC + SHA-384/512Shared secretHigher-security symmetric signing
RS256RSA + SHA-256RSA key pairAuth0, AWS Cognito, enterprise SSO
RS384 / RS512RSA + SHA-384/512RSA key pairHigh-assurance enterprise systems
ES256ECDSA + SHA-256EC key pairMobile apps, IoT — smaller token size
PS256RSASSA-PSS + SHA-256RSA key pairFAPI, open banking compliance
noneUnsignedNoneTesting only — never in production

Is It Safe to Decode a JWT Online?

Security-conscious developers rightly ask this question before pasting anything into a third-party tool. Here is an honest answer.

This tool is 100% client-side. The JavaScript that decodes your token runs entirely inside your browser. No token data is transmitted to any server, stored in a database, or logged anywhere. You can verify this by opening your browser's Network tab — you will see zero outbound requests when you click Decode.

That said, a few good practices apply regardless of which tool you use:

Use test tokens for inspection. If you are debugging in a shared environment (pair programming, screen share, public computer), use a test token rather than a production access token containing real user data.

Remember payloads are not secret. JWT payloads are only Base64url-encoded. Anyone who has the token string can read the claims. If your payload contains information you need to keep confidential, you need JWE (JSON Web Encryption), not a standard signed JWT.

Rotate compromised tokens immediately. If you accidentally expose a production JWT — in a log file, a GitHub commit, or a public paste — revoke it immediately from your auth provider and issue new tokens to affected users.

Best Practice Never paste long-lived tokens (refresh tokens, API keys, personal access tokens) into any online tool. Decode only short-lived access tokens, and prefer using test credentials during development.

Frequently Asked Questions

What is the difference between a JWT decoder and jwt.io?
jwt.io is the official reference tool from Auth0. Our JWT decoder does the same core job — decode the header, payload, and signature — but with a VS-Code-style dark interface, instant expiry parsing, and an entirely client-side implementation. Both are reliable choices for inspecting tokens during development.
Can I decode a refresh token?
It depends on the auth provider. Some providers issue refresh tokens as opaque random strings (not JWTs), which cannot be decoded because they have no internal structure. Others, like Keycloak or certain Firebase configurations, issue refresh tokens as JWTs. If yours starts with eyJ, paste it in and it will decode. If it is a random string, it is opaque and not decodable by design.
How do I decode a JWT in Flutter or Dart?
Use the dart_jsonwebtoken package from pub.dev. Call JWT.decode(token) to read the payload without signature verification. For full verification with a secret or public key, use JWT.verify(token, key). Alternatively, manually split by '.' and base64-decode the second segment using base64Url.decode() from Dart's convert library.
What does "decode JWT token online" actually do?
It splits the token by the dot separator, takes the first two parts (header and payload), applies Base64url decoding to each one, and then JSON.parses the resulting byte strings into readable objects. The third part (signature) is displayed as-is because it is a cryptographic hash, not JSON. The whole process takes under a millisecond and runs entirely in your browser.
Why does my token fail to decode?
The most common reasons are: (1) the token is an opaque token, not a JWT — it will not have the three-part dot structure; (2) you copied only part of the token — make sure you include all three segments; (3) there are trailing spaces or newline characters — the decoder trims input automatically but some environments wrap tokens in quotes; (4) it is a JWE encrypted token — the payload will be ciphertext, not JSON. Check the raw token starts with eyJ.
How do I decode a JWT access token from OAuth2 / OpenID Connect?
OAuth2 access tokens from providers like Google, Microsoft, Okta, and Auth0 are standard JWTs. Copy the access_token value from the token response and paste it here. The decoded payload will typically include iss (issuer URL), sub (user ID), aud (client ID), exp, and provider-specific claims like email, roles, or scopes.

This free online JWT decoder is built for developers who need to quickly inspect tokens during development and debugging. It supports all standard JWT algorithms and processes everything locally in your browser. No account required, no usage limits, no data collection.