JSON Web Token (JWT) es un estándar abierto (RFC 7519) que permite la transmisión segura de información entre diferentes partes como un objeto JSON. Esta información se puede verificar y confiar en su autenticidad, ya que está firmada digitalmente. En este artículo, exploraremos qué es JWT, cómo funciona y cómo implementarlo en aplicaciones web.
¿Qué es JWT?
Definición de JWT
JWT es un método de representación de información en un formato seguro y compacto que puede ser transmitido a través de URLs, POST O AJAX. Es comúnmente utilizado para la autenticación y autorización de usuarios en aplicaciones web.
Componentes de un JWT
Un JWT consta de tres partes:
- Header (Encabezado)
- Payload (Carga útil)
- Signature (Firma)
Header
El encabezado típicamente consiste en dos partes: el tipo de token, que es JWT, y el algoritmo de firma que se está utilizando, como HMAC SHA256 o RSA.
Ejemplo de un Header en formato JSON:
{ "alg": "HS256", "typ": "JWT" }
Payload
La carga útil contiene las afirmaciones (claims) sobre un usuario y otros datos. Las afirmaciones pueden ser registradas, públicas o privadas.
Ejemplo de un Payload:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Signature
Para crear la firma, se toma el encabezado codificado en Base64Url y el payload codificado en Base64Url, y se combina con una clave secreta usando el algoritmo especificado en el encabezado.
Ejemplo de la firma:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret)
¿Cómo funciona JWT?
JWT funciona en un flujo sencillo:
- Autenticación: Cuando un usuario inicia sesión, el servidor genera un JWT y lo envía al cliente.
- Almacenamiento: El cliente almacena el token (generalmente en localStorage o cookies).
- Acceso a recursos protegidos: El cliente envía el JWT en el header de autorización en solicitudes posteriores.
- Validación: El servidor valida el token y permite el acceso a recursos protegidos.
Ejemplo de flujo de autenticación con JWT
- El usuario envía sus credenciales (nombre de usuario y contraseña) al servidor.
- El servidor valida las credenciales y, si son correctas, genera un JWT.
- El servidor envía el JWT al cliente.
- El cliente almacena el JWT y lo incluye en las solicitudes subsecuentes.
- El servidor verifica el JWT y permite el acceso a los recursos seguros.
Ventajas de usar JWT
- Compacto: Debido a su tamaño reducido, JWT es ideal para ser enviado a través de encabezados HTTP.
- Autoconclusivo: Contiene toda la información necesaria sobre el usuario, lo que reduce la necesidad de consultar la base de datos.
- Seguridad: Los tokens pueden ser firmados y cifrados, lo que brinda un mayor nivel de seguridad.
Desventajas de utilizar JWT
- Tamaño del token: Aunque es compacto, el tamaño de un JWT puede incrementarse si se añaden muchas afirmaciones.
- Revocación compleja: Dado que los tokens son autoconclusivos, revocar un token antes de su expiración puede ser complicado.
- Sin estado: Aunque los JWT pueden ser usados para almacenar información de sesión, esto puede ser un problema si se necesita información constante o cada sesión debe ser cambiada.
Cómo usar JWT en aplicaciones web
Paso 1: Instalación de dependencias
Si estás utilizando Node.js, es probable que desees utilizar el paquete jsonwebtoken. Puedes instalarlo usando npm:
npm install jsonwebtoken
Paso 2: Crear un token
Cuando un usuario inicia sesión exitosamente, puedes generar un JWT:
const jwt = require('jsonwebtoken'); const user = { id: 1, name: 'John Doe' }; // Firmar el token const token = jwt.sign(user, 'secretkey', { expiresIn: '1h' }); console.log(token);
Paso 3: Verificar el token
Cada vez que recibas un token del cliente, es importante verificarlo para asegurarte de que sea válido:
jwt.verify(token, 'secretkey', (err, decoded) => { if (err) { return res.sendStatus(403); // Forbidden } console.log(decoded); // Información del usuario decodificada });
Paso 4: Configurar middleware
Puedes crear un middleware para autenticar utilizando JWT en tu servidor:
function authenticateToken(req, res, next) { const token = req.header('Authorization').split(' ')[1]; if (!token) return res.sendStatus(401); jwt.verify(token, 'secretkey', (err, user) => { if (err) return res.sendStatus(403); req.user = user; next(); }); }
Conclusión
JWT es una herramienta poderosa para la autenticación y autorización en aplicaciones web. Al permitir la transmisión segura de información, JWT se ha convertido en un estándar preferido en muchas aplicaciones modernas. Aunque tiene sus ventajas y desventajas, entender cómo implementarlo correctamente puede mejorar significativamente la seguridad y eficiencia de tu aplicación web.