DMCIT SERVICES
HomeServicesBlogContactLogin
DMCIT SERVICES

Expert consulting in Data, Mobile, and Cloud solutions to drive your digital transformation.

// Quick Links
  • Home
  • Services
  • Blog
  • Contact
  • Free Tools
// Services
  • Data Destruction
  • Mobile Device Management
  • Cloud Infrastructure
  • Digital Transformation
// Contact
[email protected]
07472 952393
Data Mobile Cloud
Unit A, 82 James Carter Road,
Mildenhall,
IP28 7DE

© 2026 Data Mobile Cloud. All rights reserved.

// FREE IT TOOLS

JWT Decoder

Decode any JSON Web Token to inspect its header, claims, and expiry — entirely in your browser.

  1. Home
  2. /
  3. Free IT Tools
  4. /
  5. JWT Decoder
// JWT TOKEN
Decoded in your browser — the token is never transmitted

Paste a token above to decode its header, claims, and expiry

What Is a JSON Web Token?

A JSON Web Token (JWT, pronounced “jot”) is a compact, URL-safe way of representing claims between two parties, standardised in RFC 7519. Tokens are almost always used as bearer credentials: whoever holds the token is treated as the identity it asserts, so a leaked token is as good as a leaked password until it expires.

Every JWT is three base64url-encoded parts separated by dots — header.payload.signature. The header names the signing algorithm, the payload carries the claims, and the signature is what lets a server confirm nobody edited the first two parts.

The critical thing to internalise: the payload is encoded, not encrypted. Base64url is a transport encoding, not a cipher. Anyone holding a token can read every claim in it — which is exactly what this tool does, and exactly why sensitive data should never be placed in a JWT.

Decoding Is Not Verifying

This is the distinction that causes real security incidents. Decoding is base64url decoding plus JSON.parse — about four lines of code, and it will happily “decode” a token you invented in a text editor. Verifying means recomputing the signature over the header and payload with the correct key and confirming it matches. Only verification proves anything.

A decoder that displayed claims without that distinction would be actively dangerous, because it invites you to trust a payload that has never been authenticated. This tool shows you the signature bytes and says plainly that it has not checked them — your server is the only component that can.

The classic attack this enables is the algorithm confusion family. In the alg: none variant, an attacker takes a legitimate token, edits the payload to escalate privileges, and rewrites the header to declare no signature — then sends it to a server that trusts the token’s own declaration of its algorithm. If that server does not reject none outright, the forged payload is accepted.

Registered Claims Reference

RFC 7519 defines seven registered claim names. They are not mandatory, but using them means every JWT library understands your token without custom handling.

ClaimNameMeaning
issIssuerThe party that created and signed the token
subSubjectThe identity the token asserts — usually a user ID
audAudienceThe party the token is intended for; a token minted for one service should be rejected by another
expExpiration TimeAfter this time the token must be rejected
nbfNot BeforeBefore this time the token must be rejected
iatIssued AtWhen the token was created — informational, not enforced
jtiJWT IDA unique identifier for this token, used for revocation lists and replay detection

A common gotcha: iat alone does not expire a token. It records when the token was made so you can reason about its age — but a server that checks only iat and never exp will accept that token forever. When you decode a token with an iat but no exp, that is worth investigating.

Hardening Your JWT Handling

Pin the algorithm. Never let the token declare which algorithm to verify with — the server decides. If your application uses HS256, verify with HS256 and reject everything else, including none.

Check the audience and issuer. A signature proves a token came from someone holding the key — not that it was minted for your service. If the same key signs tokens for several applications, skipping the aud check lets a token from a low-value service be replayed against a high-value one.

Keep expirations short and revoke actively. A JWT cannot be un-issued; a revocation list keyed on jti is what lets you kill a session before its exp arrives. That is exactly the pattern this site uses — sessions carry a version claim that is reconciled against the database on every request, so a password change immediately invalidates tokens that are still cryptographically valid.

Never put secrets in the payload. Anyone who sees the token can read every claim. No passwords, no internal hostnames, no personal data that would be a problem in a log file or a browser history.

Frequently Asked Questions

Does this tool verify the signature?
No — and neither does any decoder. Decoding a JWT only base64url-decodes its three parts and parses the JSON; the signature is displayed but never checked. Verification requires the secret or public key, which only your server holds. A token decoding successfully tells you nothing about who issued it, whether it was tampered with, or whether it is still valid on the issuing system.
Is it safe to paste a JWT into this tool?
The token is decoded entirely in your browser and is never transmitted to a server, logged, or stored. That said, a JWT is a bearer credential — anyone holding it can use it until it expires. Treat a production token the way you would treat a password, and prefer testing with a token from a development environment.
Why should I reject a token with "alg": "none"?
alg: none means the token declares that it carries no signature at all. A server that accepts these tokens will accept a payload that anyone can craft or edit. This was the root cause of several well-known authentication bypasses, where an attacker took a valid signed token, changed the payload, and set alg to none. Reject unsigned tokens unless you completely control their source.
What is the difference between exp, nbf, and iat?
exp (expiration) is the time after which the token must be rejected. nbf (not before) is the time before which the token must be rejected. iat (issued at) records when the token was created, and is informational — a server does not reject a token for being old unless it also checks exp. All three are NumericDate values: seconds since the Unix epoch, UTC.
Why does my token show as expired when the app still accepts it?
Either the application is not enforcing exp — a real vulnerability worth reporting — or it is applying its own clock skew tolerance, typically 30 to 120 seconds. Check exp against the server that issues the tokens: if the issuing server's clock is behind the machine you are decoding on, freshly issued tokens can appear already expired.
Can I edit a token and re-sign it here?
No. This tool only reads tokens — it cannot sign or modify them, and it never asks for a key. That is deliberate: a tool that accepted signing keys would be a credential-harvesting risk.
// CYBER SECURITY

Need help with authentication security?

DMC IT Services provides application security reviews, authentication design, and identity hardening for SMBs across London, Cambridge, Hertfordshire, and Bedfordshire.

Talk to an Engineer
← Back to all free tools