highCWE-613A07:2021

JWT Sin Expiración

JWTs firmados sin el claim `exp` que nunca expiran, lo que significa que un token robado da acceso permanente sin forma de revocarlo.

Cómo Funciona

Los JWTs son stateless por diseño — el servidor no los almacena. La expiración (`exp`) es el mecanismo principal para limitar su vida útil. Sin ella, un token robado hoy sigue siendo válido años después. No puedes invalidarlo sin construir una blacklist, lo que anula el propósito stateless.

Código Vulnerable
// MAL: sin expiración
const token = jwt.sign(
  { userId: user.id, role: user.role },
  process.env.JWT_SECRET!
);
Código Seguro
// BIEN: expiración corta + patrón de refresh token
const token = jwt.sign(
  { userId: user.id, role: user.role },
  process.env.JWT_SECRET!,
  { expiresIn: '15m' }
);

Ejemplo Real

Una app SaaS emitía JWTs sin expiración para acceso a su API. Cuando un empleado dejó la empresa, su token siguió funcionando indefinidamente porque no había expiración ni mecanismo de revocación.

Cómo Prevenirlo

  • Siempre pon expiresIn al firmar JWTs — 15 minutos para access tokens, 7 días para refresh tokens
  • Implementa un patrón de refresh token rotation para que los tokens de corta vida sigan siendo usables
  • Guarda los refresh tokens server-side para poder revocarlos al hacer logout o en caso de breach
  • Usa una librería como jose o jsonwebtoken que valide exp automáticamente al verificar

Tecnologías Afectadas

nodejsNext.jsPython

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas