¿Qué es un Token JWT? Requisitos, Algoritmos de Firma y Mejores Prácticas de Seguridad
Rudra Chauhan, Senior Systems Architect
¿Qué es un Token JWT? Requisitos, Algoritmos de Firma y Mejores Prácticas de Seguridad
Los tokens JSON Web (JWT) especificados en RFC 7519 son un método abierto e industrializado para representar reclamos de manera segura entre dos partes. Los JWT se utilizan ampliamente para la autenticación sin estado en APIs REST, microservicios y aplicaciones de una sola página (SPAs).
Sin embargo, una implementación inadecuada de la verificación de JWT puede introducir vulnerabilidades críticas de bypass de autenticación.
Anatomía de un Token JWT
Un string de JWT consta de tres partes base64url codificadas separadas por puntos (.):
CABECERA . RECLAMOS . FIRMA
Ejemplo:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. Cabecera
Contiene el tipo de token y el algoritmo de firma:
json{ "alg": "HS256", "typ": "JWT" }
2. Reclamos (Requisitos)
Contiene declaraciones sobre una entidad (normalmente el usuario) y metadata adicional:
sub(Sujeto): Identificador del usuarioiat(Emisión): Fecha de emisiónexp(Expiración): Fecha de expiracióniss(Emisor): Dirección URL del proveedor de identidad
3. Firma
Se crea tomando la cabecera codificada, el reclamo codificado, una clave secreta y firmándola con el algoritmo especificado.
Estructura de Reclamos de JWT
json{ "iss": "https://example.com", "sub": "1234567890", "iat": 1643723900, "exp": 1643723900, "aud": "https://example.com/api/v1", "jti": "1234567890", "name": "John Doe", "email": "john.doe@example.com", "roles": ["admin", "moderador"] }
Generación de Firma de JWT
bashecho -n '{"alg":"HS256","typ":"JWT"}' | base64 echo -n '{"iss":"https://example.com","sub":"1234567890","iat":1643723900,"exp":1643723900,"aud":"https://example.com/api/v1","jti":"1234567890","name":"John Doe","email":"john.doe@example.com","roles":["admin","moderador"]}' | base64 clave_secreta="su_clave_secreta_aqui" firma=$(echo -n "$(base64 -d <<< "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9")$(base64 -d <<< "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ")" | openssl dgst -sha256 -hmac "$clave_secreta" -binary | base64 -w 0)
2. Firma Simétrica (HS256) vs Asimétrica (RS256)
| Característica | HMAC SHA-256 (HS256) | RSA SHA-256 (RS256) |
|---|---|---|
| Tipo de Clave | Clave compartida (Simétrica) | Par de claves pública y privada (Asimétrica) |
| Firma | Realizada con la clave secreta | Realizada con la clave privada |
| Verificación | Realizada con la clave secreta | Realizada con la clave pública |
| Mejor para | Servidores monolíticos donde un solo servidor emite y verifica | Microservicios / APIs distribuidas / OAuth2 |
3. Vulnerabilidades Comunes de JWT a Evitar
1. La Vulnerabilidad "alg: none"
Algunas bibliotecas mal escritas aceptan tokens donde alg está configurado en none, lo que evita la validación de la firma. Siempre fuerce explícitamente los algoritmos permitidos en el middleware del servidor.
2. Ataque de Confusión de Algoritmo (HS256 vs RS256)
Si un servidor espera RS256 (asimétrico) pero recibe HS256, un atacante puede firmar el token utilizando la clave pública del servidor como la clave secreta. Verifique el algoritmo del token antes de la evaluación de la firma.
3. Falta de Verificación de Expiración (exp)
Los tokens sin expiración viven para siempre. Siempre fuerce una vida corta (por ejemplo, 15 minutos) para los tokens de acceso y utilice la rotación de tokens de refresco.
4. Herramientas de Desarrollo en Teksolvr
Inspeccione y depure tokens de manera segura con las herramientas de Teksolvr:
- Desencripte cabeceras y reclamos con nuestro Desencriptador de JWT.
- Pruebe reglas de validación de regex con el Prueba de Regex.
- Genere claves aleatorias utilizando el Generador de Contraseñas y Claves.
5. Ejemplos de Uso
- Autenticación: Utilice JWT para la autenticación sin estado en APIs REST, microservicios y aplicaciones de una sola página (SPAs).
- Autorización: Utilice JWT para almacenar roles y permisos del usuario, permitiendo un control de acceso fino.
- Gestión de Sesiones: Utilice JWT para gestionar sesiones de usuario, eliminando la necesidad de almacenamiento de sesiones en el servidor.
6. Mejores Prácticas de Seguridad
- Utilice HTTPS para prevenir la interceptación y la manipulación de tokens.
- Fuerce tokens de acceso y tokens de refresco con vida corta.
- Utilice un generador de números aleatorios seguro para generar claves secretas.
- Implemente la lista de tokens negros para prevenir el uso de tokens reutilizados.
- Rotee claves secretas y tokens de refresco regularmente.
7. Referencias
- RFC 7519: Tokens JSON Web (JWT)
- RFC 7515: Firma JSON Web (JWS)
- RFC 7516: Encriptación JSON Web (JWE)
8. Créditos de Imagen
Nombre del Diagrama
9. Lista de Verificación de Solución de Problemas
- Verifique la firma y el algoritmo del token.
- Verifique la expiración y la rotación de tokens de refresco.
- Asegúrese de utilizar un generador de números aleatorios seguro para la generación de claves secretas.
- Implemente la lista de tokens negros para prevenir el uso de tokens reutilizados.
10. Preguntas Frecuentes
- Q: ¿Qué es un token JWT? A: Un token JWT es un objeto JSON que contiene reclamos, una firma y una cabecera.
- Q: ¿Cuál es la diferencia entre firma simétrica y asimétrica? A: La firma simétrica utiliza una clave secreta compartida, mientras que la firma asimétrica utiliza un par de claves pública y privada.
- Q: ¿Cómo puedo prevenir la vulnerabilidad "alg: none"? A: Siempre fuerce explícitamente los algoritmos permitidos en el middleware del servidor.
11. Conclusión
Los tokens JSON Web (JWT) son un método ampliamente utilizado para representar reclamos de manera segura entre dos partes. Sin embargo, una implementación inadecuada de la verificación de JWT puede introducir vulnerabilidades críticas de bypass de autenticación. Siguiendo las mejores prácticas de seguridad, como utilizar HTTPS, fuerzar tokens de acceso y tokens de refresco con vida corta, y implementar la lista de tokens negros, puede asegurar un uso seguro y confiable de tokens JWT en sus aplicaciones.