Token No Invalidado al Hacer Logout
Tokens JWT o de sesión que siguen siendo válidos después de que un usuario hace logout porque no hay mecanismo de revocación server-side, permitiendo que tokens robados se usen indefinidamente.
Cómo Funciona
Los JWTs stateless no tienen revocación integrada. Hacer logout en el cliente (borrar el token de memoria o localStorage) no tiene sentido si el servidor sigue aceptando ese token. Un atacante que capturó el token antes del logout puede seguir usándolo hasta que expire — lo que podría ser horas, días o nunca.
// MAL: logout solo limpia el storage del cliente
export async function POST() {
// Solo le dice al cliente que borre el token
// Pero el token sigue siendo válido server-side
return Response.json({ message: 'Sesión cerrada' });
}// BIEN: mantén una denylist de tokens en Redis
import { redis } from '@/lib/redis';
export async function POST(req: Request) {
const token = req.headers.get('authorization')?.split(' ')[1];
if (token) {
const decoded = jwt.decode(token) as { exp: number };
const ttl = decoded.exp - Math.floor(Date.now() / 1000);
if (ttl > 0) await redis.setex(`denylist:${token}`, ttl, '1');
}
return Response.json({ message: 'Sesión cerrada' });
}Ejemplo Real
Cualquier app que guarda tokens JWT (apps móviles, extensiones del navegador, integraciones de terceros) es vulnerable. Si un usuario hace logout en su teléfono sospechando compromiso, la copia del token del atacante sigue siendo válida. Supabase maneja esto automáticamente — hacer tu propio auth JWT es donde esto te pica.
Cómo Prevenirlo
- Mantén una denylist de tokens en Redis con TTL igual al tiempo de vida restante del token
- Usa tokens de corta vida (15 minutos) para minimizar la ventana entre logout y expiración del token
- Para auth basado en sesiones, invalida el registro de sesión server-side al hacer logout
- Considera usar Supabase Auth o Auth.js que manejan la invalidación de sesión correctamente
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
Fijación de Sesión
highEl servidor reutiliza el mismo ID de sesión antes y después del login, permitiendo a un atacante que plantó un ID de sesión conocido secuestrar la sesión autenticada.
Sin Bloqueo de Cuenta / Protección contra Fuerza Bruta
mediumEndpoints de login sin rate limiting ni mecanismo de bloqueo, permitiendo a atacantes probar combinaciones ilimitadas de usuario y contraseña hasta encontrar credenciales válidas.
Política de Contraseña Débil
mediumSin requisitos de longitud mínima, complejidad o verificación contra contraseñas comunes en el registro o cambio de contraseña, haciendo las cuentas fácilmente vulnerables a fuerza bruta.
OAuth Sin Parámetro State
highFlujo de autorización OAuth implementado sin un parámetro `state` aleatorio, permitiendo ataques CSRF que vinculan la cuenta de una víctima con la identidad OAuth del atacante.