Decoding a JWT does not verify it. Decoding lets you read the token's encoded header and payload. Verification checks the signature or MAC using an expected algorithm and an appropriate trusted key. A receiving application must then apply the claim and token-profile rules relevant to that token, and authorization still determines whether the request may perform a particular action.
Use Letinix JWT Inspector when you need to inspect a token's header, payload and time claims. The tool decodes the token but does not verify signatures. Its output is useful for debugging, not proof that a token is authentic or accepted by an API.
The four stages are different#
| Stage | What it does | What it does not prove by itself |
|---|---|---|
| Decode | Reads the Base64url-encoded header and payload of a readable JWT format | That the token is genuine, unchanged, unexpired or trusted |
| Verify | Checks a JWS signature or MAC using an allowed algorithm and appropriate key | That every claim is acceptable or that the request is authorized |
| Validate claims | Applies issuer, audience, time and token-profile rules expected by the application | That the principal may perform every action |
| Authorize | Applies application/resource policy to the accepted identity and request | That a token will remain acceptable forever or for another resource |
The exact checks depend on the token format, protocol profile and application. RFC 7519 defines JWT claims and representations; RFC 7515 defines JSON Web Signature (JWS); RFC 8725 documents best practices for secure JWT implementations.
1. Decode: inspect the representation#
A compact signed JWT commonly has three dot-separated segments: a header, a payload and a signature. The first two segments contain Base64url-encoded JSON. Base64url is an encoding, not encryption, so decoding those segments does not require the signing key.
Decoding can answer practical questions:
- Which claims are present, such as iss, sub, aud, exp, nbf or iat?
- Which algorithm name appears in the header?
- Does the timestamp look plausible, or is exp already in the past?
- Does the token appear to belong to the environment or audience you expected?
But all of those values are still input supplied by the token. An attacker can construct a payload with plausible claims. A decoder can display it without determining whether a trusted issuer produced it.
2. Verify: check cryptographic integrity#
For a signed JWT represented as JWS, signature verification checks the signature over the JWS signing input using an expected algorithm and an appropriate key. A valid signature supports an integrity/authenticity conclusion relative to that key and verification configuration. It does not magically make every claim true in the application context.
A verifier must not blindly trust the algorithm named by an untrusted token header. The application should configure acceptable algorithms and use keys trusted for the intended issuer and token type. The exact key-discovery and verification procedure depends on the system that issues the token.
Verification also has limits. With a shared-key MAC such as HMAC, every party holding the shared secret can produce valid MACs; a valid MAC does not identify one unique signer among all key holders. With public-key signatures, the verifier must still associate the key with the expected issuer and purpose.
An encrypted JWT (JWE) is a different case: its content is encrypted, and a decoder without the necessary decryption key cannot simply read the payload. Do not assume every JWT is a three-part signed token.
3. Validate claims: apply the token contract#
After cryptographic verification, the receiving application needs to check whether the token matches its expected contract. Depending on the relevant protocol and application, checks may include:
- Issuer (iss): does it match the issuer the application trusts?
- Audience (aud): is this service an intended recipient of the token?
- Time claims: is the token currently acceptable under exp, nbf, and any applicable clock-tolerance policy?
- Token type and required claims: is this the kind of token expected at this endpoint, with the claims required by its profile?
- Key and algorithm policy: was the token verified using the configured algorithm and a key trusted for this issuer and use?
Not every claim is mandatory in every JWT. The required claims and checks come from the applicable specification, token profile, issuer contract and application configuration. RFC 8725 describes common failure modes and recommends mutually exclusive validation rules where different kinds of JWTs could otherwise be confused.
4. Authentication is not authorization#
Authentication concerns establishing an identity or validating a credential under the system's rules. Authorization is the subsequent decision about whether that identity may perform a particular operation on a resource.
A token can have a valid signature and acceptable time claims while the request is still forbidden by application policy. Conversely, a generic HTTP 401 response may not reveal which authentication check failed. Inspect the API's documented error behavior and server-side diagnostics rather than inferring the exact cause from the status code alone.
5. A safer debugging workflow#
When an API rejects a JWT, use this sequence:
- Identify the exact token and endpoint. Confirm the request actually carries the expected token type and environment. Do not paste a live bearer token into tickets or shared logs.
- Decode only to inspect. Use a synthetic token or trusted local workflow where possible. JWT Inspector can display the header, payload and time claims, but it does not perform signature verification.
- Check time values and expected claims. Look at exp, nbf, iss and aud, but treat them as untrusted until the server's checks pass.
- Run verification in the application or trusted test harness. Use the expected algorithm, trusted keys and the maintained library/configuration for the actual issuer.
- Confirm claim-validation policy. Check issuer, audience, expiry, not-before, token type and any profile-specific requirements.
- Check authorization separately. If authentication succeeds, inspect the resource and action policy for the request.
- Use diagnostics without exposing credentials. Log a specific failure category where safe, not the raw token or secrets. Prefer synthetic fixtures for reproducible bug reports.
What JWT Inspector can and cannot tell you#
JWT Inspector is an inspection utility. It decodes the token's header and payload, explains standard claims, and checks displayed time claims against your device clock. It does not verify signatures, decrypt encrypted tokens, create tokens, or establish that an API will accept a token. Its time status is an aid to inspection; the validating service's clock and configured policy remain authoritative for that service.
If the decoded claims look correct but the API rejects the request, continue with signature verification, trusted-key configuration, issuer/audience validation, token type and application policy. Do not change authorization rules simply because a token can be decoded.
References#
RFC 7515: JSON Web Signature (JWS) — IETF
RFC 7519: JSON Web Token (JWT) — IETF
RFC 8725: JSON Web Token Best Current Practices — IETF
RFC 6750: OAuth 2.0 Bearer Token Usage — IETF



