3 min read

What are JWTs and how secure are they?

Discover the ins and outs of JSON Web Tokens (JWTs) - from their structure and benefits to security vulnerabilities and best practices. Learn how to implement JWT authentication securely in your applications.
What are JWTs and how secure are they?
Photo by Muhammad Zaqy Al Fattah / Unsplash

JSON Web Tokens (JWTs) have become a cornerstone of modern web authentication, offering a stateless and scalable approach to user authentication and authorization. But with great power comes great responsibility – and the need to understand both their capabilities and potential security pitfalls.

What are JSON Web Tokens?

JSON Web Tokens are an open standard (RFC 7519) that defines a compact and self-contained way to securely transmit information between parties as a JSON object. Unlike traditional session-based authentication that stores user data on the server, JWTs contain all necessary information within the token itself.

JWT Structure

A JWT consists of three parts separated by dots (.): Header.Payload.Signature

1. Header

Contains the token type (JWT) and the signing algorithm being used:

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

2. Payload

Contains the claims (statements about an entity and additional data):

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516242622
}

3. Signature

Created by encoding the header and payload, then signing with a secret:

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

Benefits of JWTs

Stateless Authentication

JWTs are self-contained, meaning servers don't need to store session information. This makes them perfect for microservices and distributed systems.

Cross-Domain Authentication

JWTs can be easily shared across different domains and services, enabling seamless single sign-on (SSO) experiences.

Mobile-Friendly

Their compact size and JSON format make JWTs ideal for mobile applications where bandwidth and storage are considerations.

Scalability

No server-side session storage means better horizontal scaling capabilities.

Security Concerns and Vulnerabilities

While JWTs offer many advantages, they also introduce specific security challenges that developers must address.

1. Algorithm Confusion Attacks

The Problem: Attackers can modify the algorithm specified in the JWT header from asymmetric (RS256) to symmetric (HS256), potentially allowing them to sign tokens with the public key.

Example: Changing "alg": "RS256" to "alg": "HS256" in the header.

Mitigation: Always explicitly specify the expected algorithm in your verification logic, never trust the algorithm from the token header.

2. None Algorithm Attack

The Problem: Some JWT libraries accept "alg": "none" tokens without signature verification.

Mitigation: Explicitly reject tokens with "alg": "none" unless your application specifically requires unsigned tokens.

3. Secret Key Vulnerabilities

Weak Secrets: Using weak or default secrets makes tokens vulnerable to brute-force attacks.

Key Leakage: If your signing secret is compromised, attackers can create valid tokens.

Best Practices:

  • Use strong, randomly generated secrets (at least 256 bits for HS256)
  • Implement proper key rotation policies
  • Store secrets securely (environment variables, secure vaults)

4. Token Storage Issues

Local Storage Risks: Storing JWTs in localStorage makes them vulnerable to XSS attacks.

Cookie Considerations: While httpOnly cookies provide XSS protection, they're vulnerable to CSRF attacks.

Recommendation: Use httpOnly, Secure, SameSite cookies with proper CSRF protection.

5. Token Expiration and Revocation

The Challenge: JWTs are stateless, making immediate revocation difficult.

Solutions:

  • Use short expiration times (15-30 minutes)
  • Implement refresh token patterns
  • Maintain a token blacklist for immediate revocation needs
  • Consider using token introspection for critical operations

Best Practices for Secure JWT Implementation

1. Choose the Right Algorithm

  • RS256 (RSA with SHA-256): Recommended for most applications
  • ES256 (ECDSA with SHA-256): Better performance, smaller signatures
  • HS256 (HMAC with SHA-256): Only for single-service scenarios

2. Implement Proper Validation

// Example: Proper JWT validation
const jwt = require('jsonwebtoken');

function validateToken(token) {
  try {
    const decoded = jwt.verify(token, publicKey, {
      algorithms: ['RS256'], // Explicitly specify algorithm
      issuer: 'your-app',
      audience: 'your-audience'
    });
    
    // Additional custom validations
    if (Date.now() >= decoded.exp * 1000) {
      throw new Error('Token expired');
    }
    
    return decoded;
  } catch (error) {
    throw new Error('Invalid token');
  }
}

3. Minimize Sensitive Data in Payload

Remember that JWT payloads are only Base64 encoded, not encrypted. Never include:

  • Passwords
  • Social security numbers
  • Credit card information
  • Other sensitive personal data

4. Implement Rate Limiting

Protect your token endpoints with rate limiting to prevent brute-force attacks.

5. Use HTTPS Everywhere

Always transmit JWTs over HTTPS to prevent token interception.

When NOT to Use JWTs

JWTs aren't always the right solution. Consider alternatives when:

  • You need immediate token revocation
  • Your application is a simple monolith with session storage
  • You're storing large amounts of user data
  • Regulatory compliance requires server-side session management

Conclusion

JWTs are a powerful tool for modern authentication, offering stateless, scalable solutions for distributed systems. However, their security depends heavily on proper implementation. By understanding common vulnerabilities and following security best practices, developers can harness the benefits of JWTs while maintaining robust security.

Remember: security is not a one-time implementation but an ongoing process. Regular security audits, staying updated with the latest vulnerabilities, and following the principle of least privilege are essential for maintaining secure JWT-based authentication systems.

Further Reading

Subscribe to my newsletter.

Become a subscriber receive the latest updates in your inbox.