Embed this tool on your site
About this tool
JWT Decoder is a browser-only tool for decoding and inspecting JSON Web Tokens. Paste a JWT — the three base64URL dot-separated segments produced by any standard authentication system — and the tool decodes it as you type. Summary cards show the signing algorithm (alg), the token type (typ) and a status: Expired or Not expired when the payload has a numeric exp claim, or No exp when it does not. The header and payload appear as indented JSON panels, with time claims such as iat, nbf and exp left as raw Unix seconds, and the signature segment is shown as-is under Signature · not verified. No secret key is required or accepted — this is decode-only, not a verification tool, and a future expiry does not prove a token is valid. All processing runs in your browser with no network requests, making it safe to inspect real access tokens from OAuth2 flows, API gateways, or JWT-based session systems.
Why use it
Instant Expiry Check: A status card reads Expired, Not expired or No exp by comparing the exp claim with your device's clock — the first thing to rule out when debugging a 401 Unauthorized error.
Readable Header and Payload: Header and payload are decoded into separate, indented JSON panels, making it easy to find a claim such as sub, scope or roles without reading raw base64.
Zero Secret Key Exposure Risk: This tool decodes only. It accepts no signing secret and performs no cryptographic verification, so there is no risk of accidentally entering a private key or symmetric secret into an online form. Verification should always happen server-side with your secret.
Malformation Detection: Tokens that do not have exactly three segments, or whose header or payload is not base64URL-encoded JSON, are rejected with an error message instead of half-decoded output.
Algorithm Shown Up Front: The alg value from the header — RS256, HS256, ES256, none or others — appears in its own card. Seeing none or an unexpected algorithm in a token you receive is an important security signal.
Unicode-Safe Decoding: Header and payload are decoded as UTF-8, so names and claims with accented or non-Latin characters display correctly.
How to use
- Paste the full JWT string — all three dot-separated segments — into the JSON Web Token field.
- The header and payload panels fill in as you type or paste; the Decode token button re-runs the decode.
- Check the Algorithm, Type and Status cards: Status reads Expired, Not expired or No exp based on the exp claim and the current time.
- Read claims such as sub, scope, iat and exp in the payload panel; time claims are shown as raw Unix seconds, which the Unix Time Converter can turn into dates.
- If you see 'Invalid JWT: expected 3 parts' or 'Could not decode JWT parts', check for a missing segment or a leftover Bearer prefix.
- Click Clear to empty the field and the decoded panels.
When it helps
- Debugging a 401 Unauthorized API error by checking whether the token is expired or has the wrong scope.
- Inspecting the claims in a JWT returned by an OAuth2 authorization server to confirm the correct scopes and subject were granted.
- Verifying that a newly issued token from your authentication service contains the expected custom claims before testing downstream services.
- Reading the alg field of a received token to confirm the signing algorithm matches your verification configuration.
- Checking the exp and nbf timestamps of a token when debugging a clock-skew related authentication failure.
- Quickly understanding the structure of a JWT format used by a third-party service before implementing a parser in code.
Examples
01Decode a signed access token
InputeyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfMTIzIiwibmFtZSI6IkFsaWNlIiwic2NvcGUiOiJyZWFkOm9yZGVycyIsImlhdCI6MTcxNjA3NjgwMCwiZXhwIjoxNzE2MDgwNDAwfQ.<signature>
Expected result · Scroll for moreAlgorithm: RS256 · Type: JWT · Status: Expired
Header:
{
"alg": "RS256",
"typ": "JWT"
}
Payload:
{
"sub": "usr_123",
"name": "Alice",
"scope": "read:orders",
"iat": 1716076800,
"exp": 1716080400
}
Signature · not verified: <signature>
02Inspect an unsigned (none) token
InputeyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJhZG1pbiIsInJvbGUiOiJhZG1pbiJ9.
Expected result · Scroll for moreAlgorithm: none · Type: JWT · Status: No exp
Header:
{
"alg": "none",
"typ": "JWT"
}
Payload:
{
"sub": "admin",
"role": "admin"
}
Signature · not verified: (empty)
03Spot an exp written in milliseconds
InputeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c3JfMTIzIiwiZXhwIjoxNzE2MDc2ODAwMDAwfQ.c2lnbmF0dXJl
Expected resultAlgorithm: HS256 · Type: JWT · Status: Not expired
Payload:
{
"sub": "usr_123",
"exp": 1716076800000
}
The 13-digit exp is in milliseconds, so the token looks valid until the year 56350.
Tips
- If the token starts with 'Bearer ', remove that prefix before pasting — the tool expects just the three-segment JWT string without the Authorization header scheme prefix.
- Check the alg field in the header first when debugging unexpected verification failures — if it says 'none' or a different algorithm than your server expects, that is the root cause.
- Compare the exp timestamp to the current time in your browser's DevTools console with Date.now()/1000 to calculate exactly how many seconds remain before expiry.
- If a token payload contains a roles or scope claim, copy it out to verify that the user's permission set matches what the API endpoint requires before looking at other potential causes of a 403.
- JWT header typ: 'at+JWT' (access token) versus typ: 'JWT' indicates an OAuth2 Access Token per RFC 9068 — useful when debugging token type mismatches in OAuth2 resource server validation.
Frequently Asked Questions
Does this tool verify the JWT signature?⌄
No. Decoding and verifying are different operations. This tool decodes — it base64URL-decodes the header and payload so you can read the claims. Verification requires the secret or public key and must happen server-side. Never trust decoded claims without server-side signature verification.
Is it safe to paste a real production JWT here?⌄
All decoding runs entirely in your browser with no network requests. The token is never sent to any server, logged, or stored. That said, real access tokens are credentials — treat them like passwords and rotate or revoke them if you suspect exposure.
What are the three parts of a JWT?⌄
A JWT consists of three base64URL-encoded segments separated by dots: the header (algorithm and token type), the payload (claims about the user or session), and the signature (a cryptographic value computed from the header, payload, and a secret or private key).
What does the 'none' algorithm in the header mean?⌄
The alg: none value means the token has no cryptographic signature. This is a known JWT attack vector — some libraries that are misconfigured will accept unsigned tokens as valid. If you see alg: none in a token you receive, treat it as potentially forged.
What is the difference between exp and nbf claims?⌄
exp (expiration time) is the Unix timestamp after which the token must be rejected. nbf (not before) is the timestamp before which the token must also be rejected. Together they define a validity window. Both are optional but widely used in practice.
Why does the tool say Not expired for a token that should have expired?⌄
JWT exp is a Unix timestamp in seconds, not milliseconds. If the token was issued with exp in milliseconds (for example Date.now() instead of Math.floor(Date.now()/1000)), the value points tens of thousands of years into the future, so the status reads Not expired. Check the raw exp value in the payload panel: a 13-digit number is milliseconds.
Can I decode a JWE (encrypted JWT)?⌄
JWEs use a different compact serialisation: five dot-separated parts, with the payload encrypted rather than base64URL-encoded JSON. This tool handles JWS (signed JWTs with readable payloads) only. Decoding a JWE requires the recipient's private key.
What is the sub claim?⌄
sub (subject) is a standard registered claim that identifies the principal — typically a user ID or service account name — that the token was issued for. It is a string value and must be unique within the issuer's domain.
Glossary
- JWT
- JSON Web Token — a compact, URL-safe token format defined in RFC 7519 consisting of a base64URL-encoded header, payload, and signature separated by dots.
- Claims
- Key-value pairs in the JWT payload that assert facts about the subject or the token itself. Registered claims (iss, sub, exp, iat, nbf, aud, jti) have standardised meanings; custom claims are application-defined.
- Base64URL
- A variant of Base64 encoding that uses - instead of + and _ instead of / and omits padding, making the output safe for use in URLs and HTTP headers without percent-encoding.
- exp Claim
- The expiration time claim — a Unix epoch timestamp (seconds since 1970-01-01 00:00:00 UTC) after which the JWT must not be accepted. Absence means the token does not expire.
- JWS
- JSON Web Signature — the signed form of a JWT where the payload is base64URL-encoded and readable. Distinct from JWE (JSON Web Encryption) where the payload is encrypted and opaque.
- alg
- The algorithm header parameter identifying the cryptographic algorithm used to sign the token — for example RS256 (RSA + SHA-256), HS256 (HMAC-SHA256), ES256 (ECDSA + SHA-256), or none (unsigned).
A LITTLE HELP. A LOT DONE.
Good tools.
Great flow.
Your shortcut to the everyday. Create, convert, calculate,
and get back to what you love.
✳
✳
✓ Free to use✓ No sign-up✓ 500+ possibilities