8-JWT en 10 minutos - ¿Qué es JWT? ¿Para que sirve? ¿Cuando usarlo? ¿Cómo se usa?
https://www.youtube.com/watch?v=tWQobKFQLG0
Tutorial de JWT (JSON Web Tokens)
¿Qué es un JWT?
JWT significa JSON Web Token. Es un estándar abierto que permite definir de manera compacta y autocontenida cómo transmitir información entre distintas aplicaciones o entidades utilizando objetos JSON.
Características clave:
Información verificable: El contenido del token está firmado digitalmente
Puede usar diferentes métodos de firma:
Secreto compartido (solo cliente y servidor lo conocen)
Clave pública/privada
Formato estándar: Compacto y fácil de transmitir
Caso de uso principal: Autorización
El uso más común de JWTs es para autorización, donde un usuario incluye el token en cada solicitud a una API para identificarse y demostrar qué acceso tiene.
Comparación: Autenticación tradicional vs JWT
Autenticación basada en sesiones (tradicional)
Usuario envía credenciales (login)
Servidor crea sesión y la almacena
Servidor devuelve cookie con session ID
Cliente incluye cookie en cada request
Servidor verifica la sesión almacenada
Problema: En arquitecturas de microservicios, cada servicio necesita su propia autenticación.
Autenticación con JWT
Usuario envía credenciales
Servidor crea JWT (no almacena nada)
Servidor devuelve JWT al cliente
Cliente incluye JWT en cada request
Servidor valida la firma del JWT
Ventajas:
El servidor no almacena estado
Funciona perfectamente con microservicios
El token contiene toda la información necesaria
Estructura de un JWT
Un JWT tiene tres partes separadas por puntos:
aaaaa.bbbbb.ccccc1. Header (Encabezado)
Contiene:
typ: Tipo de token (JWT)alg: Algoritmo de firma (HS256, RS256, etc.)
Ejemplo (decodificado):
{
"alg": "HS256",
"typ": "JWT"
}2. Payload (Carga útil)
Contiene los "claims" (afirmaciones) - información sobre la entidad.
Hay tres tipos de claims:
Registrados: Recomendados pero no obligatorios
sub(subject): A quién se refiere el tokenexp(expiration): Tiempo de expiracióniss(issuer): Quién emitió el tokenaud(audience): Para quién es el token
Públicos: Definidos por los usuarios
Privados: Información personalizada de la aplicación
Ejemplo (decodificado):
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}3. Signature (Firma)
Se crea usando:
Header codificado
Payload codificado
Secreto
Algoritmo especificado en el header
Ejemplo práctico
Veamos un JWT real:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cPuedes inspeccionarlo en jwt.io
Flujo típico de autorización con JWT
Cliente solicita autorización al servidor de autenticación
Servidor valida credenciales y genera JWT
Servidor devuelve JWT al cliente
Cliente incluye JWT en header de requests subsiguientes:
Authorization: Bearer <token>Servidor verifica firma del JWT en cada request
Servidor responde según los permisos del usuario
Implementación práctica
Instalación (Node.js)
npm install jsonwebtokenCrear un token
const jwt = require('jsonwebtoken');
const payload = {
userId: 123,
username: 'johndoe',
roles: ['user', 'admin']
};
const secret = 'mi-secreto-super-seguro'; // En producción, usa variable de entorno
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
console.log('Token:', token);Verificar un token
try {
const decoded = jwt.verify(token, secret);
console.log('Datos decodificados:', decoded);
} catch (error) {
console.error('Token inválido:', error.message);
}Mejores prácticas
Usar expiration time: Siempre establece tiempo de expiración
Almacenar seguro: Guarda JWTs en HTTP-only cookies o localStorage seguro
Secretos seguros: Usa secretos complejos y guárdalos en variables de entorno
HTTPS: Siempre usa HTTPS en producción
Validar siempre: Verifica el token en cada request protegido
Conclusión
Los JWTs son una solución moderna y eficiente para autenticación y autorización en aplicaciones web y APIs. Su naturaleza stateless los hace ideales para arquitecturas distribuidas y microservicios.
¿Te gustaría que profundice en algún aspecto específico de JWT? ¡Déjamelo saber en los comentarios!
Comentarios
Publicar un comentario