Contents
Introducción
En el desarrollo de APIs REST, garantizar la seguridad de las comunicaciones y la identidad de los usuarios es fundamental. Una técnica popular y eficiente para esto es la autenticación basada en JSON Web Tokens (JWT). En este artículo, exploraremos en profundidad qué son los JWT, sus ventajas, el flujo completo de autenticación, ejemplos de implementación, buenas prácticas y referencias a fuentes fiables.
¿Qué es JSON Web Token (JWT)
Un JSON Web Token (JWT) es un estándar abierto (RFCnbsp7519) para compartir información segura y compacta entre dos partes como un objeto JSON. Los tokens se firman digitalmente, lo que permite verificar su integridad y autenticidad.
Estructura de un JWT
Componente | Descripción |
---|---|
Header | Define el tipo de token (JWT) y el algoritmo de firma (por ejemplo, HS256 o RS256). |
Payload | Contiene las claims (datos) que describen al sujeto, tiempos de expiración y otros atributos. |
Signature | Resultado de firmar con un secreto o clave privada la concatenación de header y payload. Garantiza la integridad. |
Ventajas de usar JWT en REST API
- Sin estado (Stateless): No es necesario mantener sesiones en el servidor.
- Escalabilidad: Al no usar almacenamiento de sesión, funciona bien en arquitecturas distribuidas.
- Autocontenidos: Incluyen toda la información de autenticación, reduciendo llamadas a la base de datos.
- Fácil integración con distintos clientes (web, móvil, IoT).
- Compatibilidad con muchos lenguajes y librerías (existen SDKs oficiales y comunitarios).
Flujo de autenticación con JWT
- El cliente envía sus credenciales (usuario/contraseña) al endpoint de inicio de sesión.
- El servidor valida las credenciales y genera un JWT firmado.
- El servidor devuelve el token al cliente.
- El cliente almacena el JWT (por ejemplo, localStorage o cookie HttpOnly).
- En cada petición subsecuente, el cliente incluye el JWT en el encabezado
Authorization: Bearer lttokengt
. - El servidor recibe la petición, verifica la firma del JWT y comprueba su validez (expiración, claims).
- Si es válido, el servidor procesa la petición si no, retorna un error
401 Unauthorized
o403 Forbidden
.
Implementación paso a paso
1. Configurar el servidor
Instalar librerías para generar y verificar JWT. Por ejemplo, en Node.js:
npm install jsonwebtoken
2. Validación de credenciales
En el login controller, compara el usuario y la contraseña con la base de datos usando algoritmos de hashing seguro (BCrypt, Argon2).
3. Generación del token
Una vez validadas las credenciales, crea el JWT:
const jwt = require(jsonwebtoken)
const payload = { sub: user.id, role: user.role }
const token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: 1h })
res.json({ token })
4. Validación del token en peticiones
Crear un middleware que extraiga el JWT del encabezado, lo verifique y adjunte los datos del usuario al request:
function authenticate(req, res, next) {
const authHeader = req.headers.authorization
const token = authHeader.replace(Bearer , )
try {
const data = jwt.verify(token, process.env.JWT_SECRET)
req.user = data
next()
} catch {
res.status(401).json({ error: Token inválido o expirado })
}
}
Buenas prácticas de seguridad
- Almacenar el secreto o clave privada de forma segura (variables de entorno, vaults).
- Usar HTTPS en todas las comunicaciones para evitar intercepciones.
- Definir tiempos de expiración cortos y gestionar Refresh Tokens.
- Validar siempre el algoritmo esperado (evitar ataques de sustitución a alg:none).
- Implementar revocación (listas negras o control de emisión).
- Configurar cookie HttpOnly si se almacena en cookies para proteger contra XSS.
Manejo de errores comunes
- Token expirado: código 401 con mensaje Token expirado.
- Sin token: 401 Authorization header faltante.
- Firma inválida: 401 Firma inválida.
- Token mal formado: 400 Formato de token incorrecto.
Consideraciones avanzadas
- Refresh Tokens: Extienden la sesión sin pedir al usuario que vuelva a iniciar sesión.
- Key Rotation: Cambio periódico de la clave para reforzar seguridad.
- Algoritmos asimétricos (RS256) para mayor confiabilidad en entornos distribuidos.
- Roles y scopes para controlar la autorización granularmente.
Recursos y referencias
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |