Codea Seguro Codea Seguro
Desarrollo Seguro Dificultad: intermedia

Gestión segura de sesiones

Sesiones de servidor vs. JWT, expiración, invalidación y dónde guardar el token.

Tras autenticar a un usuario hay que mantener su identidad entre peticiones sin reexigir la contraseña. Una gestión de sesiones débil deja la puerta abierta al secuestro de cuentas.

1. Sesiones de servidor vs. JWT

No hay una respuesta única:

  • Sesiones de servidor (ID opaco + almacén como Redis): fáciles de invalidar al instante, el estado vive en el servidor. Ideal para apps web clásicas.
  • JWT (token autocontenido y firmado): escalan sin almacén compartido, pero no se pueden revocar sin infraestructura extra. Útiles para APIs y microservicios.

Regla práctica: si necesitas logout inmediato y control fino, prefiere sesiones de servidor o JWT de vida muy corta con refresh tokens revocables.

2. Genera IDs impredecibles

El identificador de sesión debe ser aleatorio criptográficamente y largo (≥ 128 bits). Nunca derivado del usuario ni secuencial.

3. Guarda el token en el lugar correcto

// BIEN — cookie HttpOnly: inaccesible desde JS, resiste XSS
res.cookie('session', id, { httpOnly: true, secure: true, sameSite: 'lax' });

Evita localStorage para tokens de sesión: cualquier XSS lo lee. Las cookies HttpOnly son la opción por defecto más segura.

4. Expira e invalida

  • Expiración absoluta (p. ej. 24 h) y por inactividad (p. ej. 30 min).
  • Invalida en el servidor al hacer logout, no solo borres la cookie.
  • Rota el ID de sesión tras el login para prevenir session fixation.
  • Invalida todas las sesiones al cambiar contraseña o detectar actividad sospechosa.

5. Patrón de refresh tokens (JWT)

  • Access token de vida corta (minutos) + refresh token de vida larga, almacenado y revocable.
  • Rota el refresh token en cada uso (rotation) y detecta reutilización como señal de robo.

Checklist rápida

  • Elección consciente entre sesiones de servidor y JWT según necesidad de revocación.
  • IDs de sesión aleatorios, largos e impredecibles.
  • Token en cookie HttpOnly/Secure/SameSite, no en localStorage.
  • Expiración absoluta y por inactividad configuradas.
  • Invalidación en servidor al logout y rotación de ID tras login.
  • Refresh tokens revocables y con rotación si se usan JWT.