JWT Decoder
Decode JWT header and payload claims from compact or Bearer tokens, review timing, issuer, audience, signature presence, and safety notes before verifier debugging.JWT Decode Brief
| Segment | Encoded chars | Decoded bytes | Status | Note | Copy |
|---|---|---|---|---|---|
| {{ row.segment }} | {{ row.encodedChars }} | {{ row.decodedBytes }} | {{ row.status }} | {{ row.note }} |
| Claim | Location | Type | Value | Note | Copy |
|---|---|---|---|---|---|
| {{ row.claim }} | {{ row.location }} | {{ row.type }} | {{ row.value }} | {{ row.note }} |
| Severity | Check | Evidence | Next step | Copy |
|---|---|---|---|---|
| {{ row.severity }} | {{ row.check }} | {{ row.evidence }} | {{ row.nextStep }} |
Introduction:
A JSON Web Token, usually shortened to JWT, is a compact way to carry claims between systems. The header describes the token type and signing algorithm, the payload carries claims such as issuer, subject, audience, and expiry, and the signature segment is what a verifier uses to decide whether the token should be trusted.
Decoding is useful because many JWT problems are visible before a verifier runs. An access token might be expired, meant for another API, missing an issuer, using an unexpected algorithm, or carrying readable sensitive data in the payload. Seeing the decoded header and claims helps a developer or reviewer decide what to check next.
The important boundary is trust. A decoded token is readable, not proven. A signature can be present while still unchecked, an algorithm header can be misleading if code trusts it blindly, and a time-active token can still be rejected by the relying party because the issuer, audience, key, or revocation state does not match policy.
Encrypted JWTs are different. A five-part compact JWE hides its claims behind encryption, so a normal decoder cannot reveal the payload without decryption keys. For signed or unsigned compact JWTs, decoding is a practical inspection step before server-side verification and application policy review.
Technical Details:
JWT inspection starts with compact serialization. A signed JWS-style token commonly has three period-separated parts: protected header, payload, and signature. Each visible part is Base64URL text. The decoded header and payload are UTF-8 JSON objects, while the signature segment is bytes that only become meaningful when a verifier checks them with the right algorithm and key.
Registered JWT claims give the main timing and routing vocabulary. iss names the issuer, sub names the subject, aud names recipients, exp sets the expiration time, nbf blocks use before a not-before time, iat records issue time, and jti gives a token identifier. Time claims use NumericDate seconds from the Unix epoch; strings that merely look like dates do not carry the same meaning.
Base64URL decoding is reversible for readable JWT parts, but it is not decryption. Payload claims in a signed JWT should be treated as visible data. Passwords, client secrets, API keys, and refresh-token-like values do not become safe just because they sit inside a token payload.
Transformation Core:
The decoder turns compact text into structured inspection rows in a fixed sequence. Each stage must succeed before the later claim, timing, and safety checks can be trusted.
| Stage | Accepted input | Output | Failure or limit |
|---|---|---|---|
| Source cleanup | One compact JWT, or an Authorization: Bearer line. |
The first non-empty token-like line is selected for decoding. | Extra non-empty lines are ignored and shown as a warning. |
| Part count | header.payload or header.payload.signature. |
Header, payload, and signature rows are prepared. | Five-part compact JWE input is rejected because encrypted claims cannot be revealed here. |
| Base64URL check | Characters A-Z, a-z, 0-9, _, and -. |
URL-safe text is normalized for decoding. | Characters outside the alphabet or impossible padding length stop decoding. |
| JSON decode | UTF-8 JSON in the header and payload segments. | JSON objects used for the claim ledger and safety checks. | Invalid UTF-8, invalid JSON, arrays, and scalar values are rejected. |
| Signature inspection | Optional third segment. | Encoded length and decoded byte count. | Presence is not cryptographic verification. |
Rule Core:
After decoding, the safety notes compare token fields with browser time and optional review inputs. These checks help triage obvious problems, but they do not replace the relying party's verifier.
| Check | Boundary used here | Result meaning |
|---|---|---|
| Algorithm header | Missing alg or alg=none is called out. |
The token needs verifier-side algorithm policy before acceptance. |
| Signature verification | A non-empty third segment counts as signature bytes present. | The summary still marks the token as not verified. |
| Expiration | With tolerance s, expired means current time minus s is at or after exp. |
Expired tokens produce a Fail note; missing exp produces a Review note. |
| Not-before | With tolerance s, not active means current time plus s is before nbf. |
The token may be early, or issuer and verifier clocks may not agree. |
| Issued-at | With tolerance s, future issue means current time plus s is before iat. |
The output points to clock drift or unexpected issuer timing. |
| Maximum TTL review | When both iat and exp are numeric, lifetime is exp - iat. |
A configured hour limit produces Pass or Warn rows; zero skips this review. |
| Issuer and audience | Issuer must match exactly. Audience can be a string or array and passes when any expected value is present. | Mismatch means the token may belong to another issuer or recipient. |
| Readable sensitive claims | Payload keys resembling passwords, secrets, API keys, private keys, client secrets, or refresh tokens are flagged. | Signed JWT payloads are readable after decoding, so secret-like claims need removal or encryption. |
Registered claim map:
| Claim | Meaning | Review cue |
|---|---|---|
iss |
Issuer | Compare with the expected issuer value for the environment. |
sub |
Subject | Use it to identify the user, client, or principal described by the token. |
aud |
Audience | Confirm the intended API, client, or relying party is listed. |
exp |
Expiration time | Check whether the browser clock sees the token as active or expired. |
nbf |
Not-before time | Use it to explain tokens that fail before their start time. |
iat |
Issued-at time | Compare with exp for token lifetime and future-clock warnings. |
jti |
JWT ID | Useful for replay review, incident notes, and token traceability. |
Everyday Use & Decision Guide:
Start with one token. Paste a compact JWT or a full Authorization: Bearer line into JWT, or use Browse JWT for a small text file. The decoder reads the first non-empty line only; if the warning says extra lines were ignored, split the sample and inspect each token separately.
Use Expected issuer and Expected audience when you know the relying party's policy. Leaving them blank is fine for a first look, but it also means the safety notes cannot tell you whether iss or aud matches the application you are debugging. Use comma-separated audience values when more than one recipient is acceptable.
Set Clock tolerance only when the verifier really allows clock skew around exp, nbf, and iat. A generous tolerance can make a borderline token look acceptable during inspection even though production verification may be stricter. Use Maximum TTL review when policy limits token lifetime from issue time to expiration time.
- Use
Token Partsto confirm the compact structure, decoded byte counts, and signature segment status. - Use
Claim Ledgerto read every header parameter and payload claim with value type and notes. - Use
Validity Timelinewheniat,nbf, orexpneed a quick time comparison. - Use
Safety Notesfor the findings that should slow a handoff, such as missing signatures, expired timing, issuer mismatch, or readable secret-like claims. - Use
JSONwhen another reviewer needs the decoded structure and the explicitsignature_verifiedstate.
A good fit is debugging a token sample, preparing an issue note, or comparing what an identity provider issued against what an API expects. A poor fit is deciding that a bearer token is valid for access; that decision belongs in verifier code with trusted keys, issuer and audience policy, clock rules, and revocation handling.
Step-by-Step Guide:
Work from structure to claims, then from timing to trust warnings.
- Paste a compact token into
JWT, paste anAuthorization: Bearerline, chooseBrowse JWT, or selectLoad sample. A valid source showsJWT Decode Brief; an empty source asks you to paste a JWT before decoding. - Open
Advancedand enterExpected issuer,Expected audience,Clock tolerance, orMaximum TTL reviewonly when those values match the system you are checking. - Read the summary badges. Confirm the algorithm badge, validity badge, payload claim count, and the persistent
Not verifiedbadge before moving to detailed rows. - Open
Token Parts. Check that Header and Payload showJSON object, then read the Signature row forPresent,Empty, orMissing. - Open
Claim Ledger. Review header parameters such asalg,typ, andkid, then check payload claims such asiss,sub,aud,iat,nbf, andexp. - Open
Validity Timelinewhen timing claims are present. If the chart says there are no NumericDate claims, return toClaim Ledgerand check whether the timing values are missing or not numeric. - Open
Safety Notesand handle anyFail,Warn, orReviewrow before sharing the token analysis. TheNext stepcolumn names the follow-up check. - If decoding fails, fix the source format first: use two or three compact parts, remove unsupported characters, avoid five-part JWE input, and make sure the header and payload decode to JSON objects.
Interpreting Results:
The first result to trust is the warning that signatures are not verified. Time-active means the browser clock and optional tolerance did not find an expiration, not-before, or future-issued problem. It does not mean the token came from the right issuer, was signed with the right key, or should be accepted by an API.
Expired, Not active yet, Future iat, and No exp are timing interpretations, not full policy decisions. Use the Validity Timeline and Claim Ledger together so you can see both the UTC value and the raw claim that produced it.
| Output cue | Meaning | Follow-up |
|---|---|---|
Not verified |
The signature has not been cryptographically checked. | Verify signature, key, issuer, audience, and clock claims in the relying party. |
Signature verification |
Safety note for present, missing, or unusable signature bytes. | Treat present bytes as inspect-only until server-side verification succeeds. |
Issuer comparison |
Exact comparison between iss and Expected issuer. |
Reject or route the token to the correct issuer configuration when it warns. |
Audience comparison |
Checks whether any expected value appears in aud. |
Confirm the API or client that will process the token is actually listed. |
Readable sensitive claims |
A payload key resembles secret-bearing data. | Remove the value from signed JWT payloads or use encrypted token handling. |
The best corrective check is external to the decoded view: run the token through the same verifier, key source, issuer policy, audience policy, and lifetime rules that production uses. Use the decoded rows to explain why a token looks suspicious, not to bypass verification.
Worked Examples:
Signed access-token sample. A compact three-part token has header alg=RS256 and typ=JWT, payload iss=https://auth.example.com, sub=user_123, aud=api://orders, iat=1767225600, exp=1893456000, and a non-empty signature segment. With Expected issuer set to https://auth.example.com and Expected audience set to api://orders, JWT Decode Brief shows a future expiration, Token Parts shows Signature Present, and Safety Notes still includes Signature verification as Review because the signature bytes are not checked here.
Expired two-part debug token. A token with header alg=none, payload iss=https://auth.example.com, sub=tester, aud=api://orders, and exp=1704067200 decodes, but JWT Decode Brief reports an expired token. Token Parts shows Signature Missing, and Safety Notes flags Algorithm header, Signature verification, and Expiration. That is useful for a fixture or test note, but it should not be treated as an acceptable bearer token.
Issuer mismatch during API debugging. A three-part token lists iss=https://login.example.net and aud=["api://orders","api://reports"]. If Expected issuer is https://auth.example.com and Expected audience is api://orders, Safety Notes warns on Issuer comparison while audience passes. The decoded token may belong to a different environment even though the audience includes the API.
Encrypted or malformed source. A five-part compact JWE such as part1.part2.part3.part4.part5 fails with the encrypted-payload message because claims cannot be revealed without keys. A source with two pasted tokens on separate lines decodes only the first and shows the extra-line warning, so the corrective path is to inspect one compact token at a time.
FAQ:
Does this verify the JWT signature?
No. The output always marks the token as not verified. A signature segment can be decoded and counted, but trust requires verifier code with the correct algorithm, trusted key source, issuer, audience, clock rules, and revocation policy.
Why does a five-part token fail?
Five compact parts indicate JWE-style encrypted content. The decoder can inspect signed or unsigned compact JWT parts, but encrypted claims cannot be revealed without decryption keys.
What does the extra-line warning mean?
Only the first non-empty line is processed. If you pasted several tokens, split them and decode one at a time so Claim Ledger, Safety Notes, and JSON all describe the same token.
How should clock tolerance be set?
Use the same tolerance your verifier allows, in seconds. The value affects exp, nbf, and iat review, so a larger value can hide a boundary timing problem that a stricter verifier would reject.
Is it safe to paste a production bearer token?
The token text and local file content are decoded in the browser and the tool has no JWT upload endpoint, but bearer tokens are credentials. Avoid pasting live tokens on shared devices, and rotate any token that may have been exposed.
Glossary:
- JWT
- A JSON Web Token, a compact token carrying header data, claims, and sometimes a signature.
- JWS
- JSON Web Signature, the signed compact structure commonly seen as header, payload, and signature.
- JWE
- JSON Web Encryption, an encrypted token form whose compact version has five parts.
- JOSE header
- The JSON header that names token type, algorithm, key hints, and related parameters.
- Claim
- A name and value inside the payload, such as
iss,aud, orexp. - Base64URL
- The URL-safe text encoding used for compact JWT parts.
- NumericDate
- A JWT time value expressed as seconds from the Unix epoch.
- Bearer token
- A credential presented by whoever holds it, commonly sent in an HTTP authorization header.
References:
- RFC 7519: JSON Web Token (JWT), RFC Editor, May 2015.
- RFC 7515: JSON Web Signature (JWS), RFC Editor, May 2015.
- RFC 7516: JSON Web Encryption (JWE), RFC Editor, May 2015.
- RFC 8725: JSON Web Token Best Current Practices, RFC Editor, February 2020.