Autenticación (Sesión vs JWT)
Explicado lo más simple posible… pero no más.
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
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
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


