Autenticación (Sesión vs JWT)

Autenticación (Sesión vs JWT)

Explicado lo más simple posible… pero no más.

Stephane Moreau | Substack)

Autenticación vs Autorización

Autenticación y Autorización resuelven dos preguntas fundamentales de seguridad en cualquier sistema:

  • Autenticación: “¿Quién eres?” - Probar y verificar la identidad del usuario
  • Autorización: “¿Qué estás autorizado a hacer?” - Determinar permisos y derechos de acceso

Después de que un usuario inicia sesión una vez, el sistema necesita una forma de “recordarlos” a través de múltiples solicitudes sin pedir credenciales repetidamente. Hay dos enfoques fundamentalmente diferentes para mantener el estado de inicio de sesión:

  • Autenticación basada en sesiones
  • Autenticación basada en JWT

Autenticación basada en sesiones

550x278.7671232876712

Característica clave: El servidor almacena el estado de la sesión, lo que lo hace estado (stateful). El ID de sesión es solo una clave de referencia.

Componentes:

  • Cookie: Contiene el ID de sesión (cadena pequeña y opaca)
  • Almacenamiento de sesión: Almacenamiento centralizado (Redis, base de datos, Memcached)
  • Datos de sesión: ID de usuario, expiración, metadatos almacenados en el servidor

Autenticación basada en JWT

550x390.7894736842105

Característica clave: No hay almacenamiento del lado del servidor, lo que lo hace sin estado (stateless). Todos los datos están en el token mismo.

Estructura del JWT (tres partes separadas por puntos):

header.payload.signature

Ejemplo:
eyJhbGc...  .  eyJ1c2Vy...  .  SflKxwRJ...
[algoritmo]    [datos de usuario]     [firma]

Algoritmos de firma:

  • HMAC (HS256): Simétrico - misma clave para firmar y verificar (más simple, más rápido)
  • RSA/ECDSA: Asimétrico - clave privada firma, clave pública verifica (más seguro para sistemas distribuidos)

Patrón de actualización de token (Mejor práctica para JWT)

Token de acceso (de corta duración: 15 min) ────┐
                                       ├──▶ Solicitudes regulares a la API
Token de refresco (de larga duración: 7 días) ────┘
         │
         └──▶ Solo enviado al endpoint /refresh cuando el token de acceso expira

Ventajas y desventajas

550x176.40796703296704