Developer Guides

Demystifying JSON Web Tokens (JWT): RFC 7519 Architecture, Expiration Claims & Security Best Practices

Try & Tool Security Research• Published: 2026-10-14• 12 min read
Learn how JSON Web Tokens work under the hood. Master Base64URL encoding, inspect standard claims (exp, nbf, iat), prevent the 'alg: none' vulnerability, and compare HS256 vs RS256 signature verification.

Stateless Authentication & The Rise of JSON Web Tokens

JSON Web Tokens (JWT, standardized under RFC 7519) have become the dominant authentication mechanism for modern web applications, Single Page Applications (SPAs), mobile backends, and microservices. By packaging identity claims, authorization scopes, and digital signatures into a compact, URL-safe string, JWTs allow distributed systems to authenticate requests statelessly without querying a central session database on every API call.

However, improper JWT implementation introduces critical security vulnerabilities, including algorithm confusion attacks, signature bypasses, and token leakage.

In this guide, we demystify the internal architecture of JWTs, dissect standard claims, analyze cryptographic signature algorithms, and review production security guidelines.

To inspect, verify, or debug your tokens safely in your browser without transmitting sensitive credentials over the internet, use our free JWT Decoder & Inspector.


The Three-Part Anatomy of a JSON Web Token

A JSON Web Token consists of three distinct Base64URL-encoded strings separated by periods (.):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsZXgiLCJpYXQiOjE1MTYyMzkwMjJ9.4pzawE416q0eS2DqV
[ HEADER ] . [ PAYLOAD ] . [ SIGNATURE ]

1. Header (Metadata & Algorithm)

The Header specifies the token type and the cryptographic algorithm used to secure the signature:

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload (Claims & Identity)

The Payload contains statement claims about the user or entity, along with metadata:

{
  "sub": "user_8941203",
  "name": "Alex Vance",
  "role": "system_administrator",
  "iat": 1728900000,
  "exp": 1728903600
}

3. Signature (Tamper Prevention)

The Signature is generated by taking the Base64URL-encoded header, the Base64URL-encoded payload, a secret key or private key, and passing them through the specified hashing or signing algorithm:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)

If an attacker attempts to modify the payload (e.g., changing "role": "user" to "role": "admin"), the signature check fails immediately, and the API server rejects the request.


Standard RFC 7519 Claims Explained

RFC 7519 defines seven standard reserved claims to establish universal interoperability:

Claim KeyClaim NameDescription & PurposeExample Value
issIssuerIdentifies the identity provider or auth server that generated the token."https://auth.tryandtool.com"
subSubjectThe unique identifier of the user or principal authenticated by the token."usr_a9f82d1b"
audAudienceIdentifies the recipients or backend API service the JWT is intended for."https://api.tryandtool.com"
expExpiration TimeUnix epoch timestamp (seconds) identifying when the token expires.1728903600
nbfNot BeforeUnix epoch timestamp identifying the exact time before which the token must NOT be accepted.1728900000
iatIssued AtUnix epoch timestamp identifying when the auth server created the token.1728900000
jtiJWT IDA unique cryptographic nonce/identifier for the token, used to prevent replay attacks."c98f-402a-98bb"

Calculate exact token lifetimes or convert epoch timestamps to local time with our Unix Timestamp Converter.


Critical JWT Security Vulnerabilities & How to Avoid Them

1. The Notorious "alg: none" Vulnerability

The JWT specification originally permitted an algorithm named none for unsigned tokens in test environments. If an authentication server blindly trusts the token's alg header without enforcing expected algorithms, an attacker can modify the payload, set "alg": "none", strip the signature, and gain full unauthorized access.

Remediation: Always enforce strict server-side algorithm whitelisting:

// ❌ INSECURE: Blindly trusting token header
jwt.verify(token, secret);

// ✅ SECURE: Strictly whitelist expected algorithm
jwt.verify(token, secret, { algorithms: ['RS256'] });

2. HS256 (Symmetric) vs. RS256 (Asymmetric) Keys

  • HS256 (HMAC with SHA-256): Uses a single shared secret key for both signing and verifying. If any microservice needs to verify the token, it must possess the shared secret. If that microservice is compromised, an attacker can forge tokens across the entire enterprise.
  • RS256 (RSA Signature with SHA-256): Uses a Private Key to sign the token on the auth server, and a Public Key (distributed via JWKS) for resource servers to verify. The resource servers can never forge tokens.

Production Recommendation: For enterprise microservices and multi-tenant architectures, always use asymmetric signing (RS256, ES256, or EdDSA) over symmetric HS256.

3. LocalStorage vs. HttpOnly Secure Cookies

  • Storing JWT in localStorage: Vulnerable to Cross-Site Scripting (XSS). Any malicious script injected via an npm package, CDN, or inline script can execute localStorage.getItem('token') and exfiltrate your user's session.
  • Storing JWT in HttpOnly, Secure, SameSite=Lax Cookies: JavaScript cannot read the token, neutralizing XSS exfiltration.

Inspect, decode, and verify your tokens locally in your browser with zero network transmission using our client-side JWT Decoder & Inspector.