JWT Decoder, Inspector & Signature Verifier
A JSON Web Token (JWT) is a compact, self-contained token format — defined in RFC 7519 — used to securely represent identity and session claims between services. When you log in to a modern web application, API, or OAuth 2.0 service, the access token you receive is almost always a JWT.
Paste any JWT below to instantly decode the header and payload, inspect all standard and custom claims with human-readable timestamps, and optionally verify the signature using HS256/RS256/ES256 and all standard variants.
This is a private JWT decoder that runs entirely in your browser via the Web Crypto API — you can decode a JWT without sending it to any server. The tool is a fully local JWT decoder: no upload, no account, no telemetry on token contents. You can verify there are zero outbound network requests carrying your token in DevTools → Network.
Paste any JWT token to decode it instantly
View the decoded header, payload, and all claims — including expiry status, issuer, subject, audience, and custom claims.
All JWT decoding runs locally in your browser. Your token is never sent to any server, stored, or logged. Disconnect from the internet and this tool still works.
How to Use This JWT Decoder
A step-by-step guide to decoding, inspecting, and verifying JSON Web Tokens with this tool.
Paste your JWT token
A valid JWT contains exactly three Base64url-encoded segments separated by dots (
header.payload.signature). The segment counter shows how many parts were detected. If it reads less than 3/3, the token may be truncated or malformed.Read the Decoded tab
alg) and token type (typ). Common algorithms include HS256 (HMAC-SHA256, shared secret), RS256 (RSA-SHA256, asymmetric key pair), and ES256 (ECDSA-SHA256).An amber warning reminds you that decoding is not verification: anyone can decode a JWT without a key. The payload is Base64url-encoded, not encrypted, so its contents are fully readable by anyone holding the token.
Inspect claims in the Claims tab
expExpiration — shows Active or Expired with a status badgenbfNot Before — shows Not Yet Valid if still in the futureiatIssued At — formatted as a human-readable date and relative timeissIssuer — the auth server that created the tokensubSubject — typically a user ID or service accountaudAudience — the intended recipient of the tokenjtiJWT ID — unique identifier to prevent replay attacks
Custom claims defined by your application appear in a separate section below.
Verify the signature (optional)
- ·HMAC tokens (HS256/384/512): paste or type the shared secret string
- ·RSA tokens (RS256/384/512, PS256/384/512): paste the public key in PEM format
- ·ECDSA tokens (ES256/384/512): paste the EC public key in PEM format
All cryptographic operations use the browser's built-in Web Crypto API. Your key is never transmitted. A green result means the signature is valid; red means the key is wrong, the algorithm mismatched, or the token was tampered with.
Troubleshoot common issues
- ▸"Expired" badge — The exp claim is in the past. Check your server clock and token issuance logic. Never extend expiry to work around bugs — fix the root cause.
- ▸"Invalid signature" — Caused by: wrong secret or key, wrong key format (raw vs. base64), token modified after signing, or alg mismatch. Double-check the key and algorithm.
- ▸"Malformed JWT" — The token must have exactly three dot-separated segments. Whitespace, line breaks, or extra characters will cause parse failures. Copy the token fresh from the source.
- ▸Missing exp claim — The token shows "No Expiry." Technically valid, but poor security practice — tokens without an expiration remain valid indefinitely unless actively revoked.
For a comprehensive reference, see the Common JWT Errors and Fixes guide.
JWT Structure Explained
A JSON Web Token has three Base64url-encoded segments separated by dots. Understanding each part helps you decode and verify tokens correctly — and avoid common security mistakes.
Header
The header is a JSON object that declares the token type and the signing algorithm. It is Base64url-encoded — not encrypted — so anyone can read it without a key.
{
"alg": "HS256", // signing algorithm
"typ": "JWT", // token type
"kid": "key-01" // key ID (optional hint for verification)
}The alg field controls how the signature is computed and must be validated by the receiver. Never accept a token where alg has been substituted with "none" — this is a known algorithm confusion attack.
Payload
The payload contains the token's claims — key-value statements about the subject and session. It is Base64url-encoded but NOT encrypted. Anyone holding the token can read every claim without a key. Never store passwords, secrets, or sensitive PII in a JWT payload.
{
"sub": "user_123", // Subject (user ID)
"iss": "https://auth.acme.com", // Issuer
"aud": "https://api.acme.com", // Audience
"exp": 1716480961, // Expiry (Unix timestamp)
"iat": 1716477361, // Issued At
"name": "Jane Developer", // Custom claim
"roles": ["editor", "viewer"] // Custom claim
}Signature
The signature is computed over base64url(header) + "." + base64url(payload) using the signing key. It makes the token tamper-evident: if a single byte of the header or payload changes, the signature no longer matches. However, the signature only proves authenticity when you actually verify it — decoding alone tells you nothing about whether the token is authentic.
// For HS256: HMACSHA256( base64url(header) + "." + base64url(payload), shared_secret ) // For RS256: RSA_SHA256_Sign( base64url(header) + "." + base64url(payload), private_key )
What is Base64url encoding?
Base64url is a variant of standard Base64 that replaces + with - and / with _, and omits padding characters (=). This makes JWTs safe to use in URLs, HTTP headers, and cookies without additional encoding. Crucially, Base64url is a reversible encoding — not encryption. Any Base64url string can be decoded by anyone, with no key required. The JSON payload inside a JWT is therefore readable by anyone who has the token.
JWT Security Notes
Essential security considerations every developer working with JWTs should understand.
Always verify signatures server-side
Decoding a JWT reveals its claims but proves nothing about authenticity. Server-side signature verification — using a trusted JWT library with your issuer's public key or shared secret — is the only way to confirm a token is genuine and unmodified. Client-side verification (as this tool provides) is for debugging and inspection only.
Decoded payloads can be tampered with
If your application reads JWT claims without verifying the signature, an attacker can modify the payload and re-encode it. A common example: changing "role": "user" to "role": "admin". The signature will then be invalid — but only if you check it. Applications that skip verification are vulnerable to privilege escalation.
Validate exp, nbf, iss, and aud explicitly
Signature verification proves the token was signed with a known key. It does not automatically enforce claim constraints. Your server must still explicitly: reject tokens where exp is in the past, reject tokens where nbf is in the future, verify iss matches the expected issuer URL, and verify aud matches your service identifier. Many real-world vulnerabilities come from skipping these checks.
Never store sensitive data in JWT payloads
The JWT payload is encoded, not encrypted — it is readable by anyone who has the token, including users, proxies, and logging systems. Never include passwords, API secrets, private keys, credit card numbers, social security numbers, or unredacted PII in JWT claims. For sensitive data that must travel in a token, use JSON Web Encryption (JWE) instead.
Protect your signing keys
For HS256, your shared secret must be long (at least 32 bytes of high-entropy random data), kept out of source control, and rotated immediately if compromised. For RS256/ES256, never expose your private key in client-side code. Publish your public keys via a JWKS endpoint and implement key rotation with overlap periods so existing tokens remain verifiable during rotation.
Use this tool safely with production tokens
Although this tool processes tokens entirely in your browser (nothing is transmitted), good security hygiene still applies: avoid pasting live production tokens from critical systems into browser-based tools when possible. Use staging tokens or development tokens for debugging. If you must inspect a production token, disconnect from the network first to confirm no requests are made, then clear the input field when done.
Frequently Asked Questions
Common questions about JWT decoding, verification, and security.
JWT decode is the process of Base64url-decoding a JSON Web Token to reveal its header and payload. A JSON Web Token (JWT) is a compact, URL-safe token defined in RFC 7519 that consists of three dot-separated segments: a header declaring the algorithm, a payload containing claims (key-value data), and a cryptographic signature. Developers decode JWTs to inspect the claims a token carries — such as user ID, roles, expiry time, and issuer — without needing access to the signing key. Common use cases include debugging authentication issues, inspecting third-party tokens, validating claim values during development, and understanding what data a token exposes.
JWT Developer Guides
In-depth technical guides covering JWT structure, security, algorithms, and common debugging scenarios.