Token JWT: estructura y seguridad
Los JWT son tokens compactos y autosuficientes que transportan identidad y permisos, pero solo resultan seguros si se firman y validan correctamente.
Descripción general
JWT significa JSON Web Token y es un formato ampliamente utilizado para transmitir claims entre dos partes. Un JWT consta de tres partes: encabezado, carga útil y firma, separadas por puntos y codificadas en Base64Url. El encabezado contiene metadatos como el algoritmo y el tipo de token, la carga útil contiene claims como tiempo de expiración, emisor e ID de usuario, y la firma garantiza la integridad y autenticidad. Los JWT se usan frecuentemente para autenticación de API y autorización, pero presentan riesgos de seguridad si se implementan incorrectamente. Las reglas clave son: vigencia corta, algoritmos fuertes, validación correcta del emisor y audiencia, uso de HTTPS y nunca almacenar datos sensibles en la carga útil, ya que solo está codificada, no encriptada.
Componentes principales
Encabezado
El encabezado típicamente contiene dos claims: alg para el algoritmo utilizado y typ para el tipo de token. Está codificado en Base64Url. El algoritmo debe ser un procedimiento asimétrico como RS256 o un procedimiento simétrico fuerte como HS256 con un secreto largo. El algoritmo none nunca debe ser aceptado.
Carga útil
La carga útil contiene los claims. Los claims estándar son sub para sujeto, iss para emisor, aud para audiencia, exp para tiempo de expiración, iat para tiempo de emisión, nbf para no antes de, y jti para ID de JWT. Se pueden añadir claims específicos de la aplicación como roles o permisos. La carga útil también está codificada en Base64Url y es legible para cualquiera que posea el token.
Firma
La firma se crea combinando encabezado y carga útil, firmándolos con el algoritmo elegido y la clave. Garantiza que el token no ha sido alterado. El receptor verifica la firma usando la clave pública o simétrica del emisor.
Codificación Base64Url
Base64Url es una variante segura para URL de la codificación Base64. Reemplaza el símbolo más y la barra diagonal por otros caracteres y elimina el relleno. Permite la representación compacta de datos JSON en tokens que pueden transmitirse en URLs y encabezados.
Algoritmos de firma
RS256 utiliza RSA con SHA-256 y un par de claves privada y pública. El emisor firma con la clave privada, el receptor verifica con la clave pública. HS256 utiliza un secreto compartido. Los procedimientos asimétricos son más adecuados para sistemas distribuidos.
Claims y tiempo de expiración
Los claims son los datos centrales en un JWT. exp define el tiempo de expiración y es especialmente importante para limitar la vida útil de un token. Una vigencia corta reduce el riesgo si se roba un token. iat y nbf ayudan a restringir aún más el período de validez.
Validación de token
Un servidor de recursos debe verificar lo siguiente al recibir un JWT: firma, tiempo de expiración, emisor, audiencia, algoritmo y claims necesarios. Las verificaciones omitidas o incorrectas pueden llevar a acceso no autorizado.
Transporte de token
Los JWT se transmiten principalmente en el encabezado Authorization como token Bearer. El encabezado se ve así: Authorization: Bearer eyJhbGciOiJIUzI1NiIs… . La transmisión siempre debe hacerse por HTTPS para evitar el robo de tokens.
Riesgos de seguridad
Los riesgos conocidos incluyen confusión de algoritmo, donde los atacantes cambian el algoritmo a none, claves débiles con HS256, vigencia larga, falta de verificación de audiencia y almacenar datos sensibles en la carga útil. Además, los tokens robados pueden ser utilizados mientras sean válidos, por lo que la vida útil corta es importante.
JWK y JWKS
JWK significa JSON Web Key, JWKS significa JSON Web Key Set. JWKS es una colección de claves públicas que un servidor de recursos utiliza para validar JWT. El servidor de autorización generalmente publica JWKS en una URL conocida, permitiendo que las claves se intercambien automáticamente.
Ejemplo práctico
Después de una autenticación exitosa, un cliente API recibe un token JWT de acceso. El token consta de tres partes codificadas en Base64Url.
Encabezado decodificado:
{
"alg": "RS256",
"typ": "JWT"
}
Carga útil decodificada:
{
"sub": "user-98765",
"iss": "https://auth.example.com",
"aud": "https://api.example.com",
"exp": 1751300000,
"iat": 1751296400,
"scope": "read:orders write:orders"
}
El token completo se transmite en el encabezado Authorization:
GET /api/v1/orders
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
El servidor de recursos verifica la firma con la clave pública, valida exp, iss, aud y scope, y luego permite el acceso. Si el token ha expirado o la firma es inválida, el servidor responde con 401 Unauthorized.
Preguntas frecuentes: Token JWT
1. ¿Qué es un JWT?
2. ¿Cómo está estructurado un JWT?
3. ¿Qué son los claims?
4. ¿Está encriptada la carga útil de un JWT?
5. ¿Qué es la firma de un JWT?
6. ¿Cuál es la diferencia entre RS256 y HS256?
7. ¿Qué significa el algoritmo none?
8. ¿Qué es confusión de algoritmo?
9. ¿Qué es JWKS?
10. ¿Por qué debe ser corta la vida útil de un JWT?
11. ¿Qué es un token Bearer?
12. ¿Cómo se valida un JWT?
13. ¿Qué es un token de refresco?
14. ¿Se deben almacenar JWT en el navegador?
15. ¿Cuáles son los errores típicos de seguridad en JWT?
Continúa en la ruta de aprendizaje de API
El siguiente artículo en la ruta de aprendizaje de API trata sobre Autenticación y autorización en API: fundamentos, diferencias y procedimientos — las diferencias entre autenticación y autorización, así como los procedimientos más importantes.
Fuentes
- https://datatracker.ietf.org/doc/html/rfc7519
- https://datatracker.ietf.org/doc/html/rfc7517
- https://datatracker.ietf.org/doc/html/rfc7518
Recomendaciones de libros sobre seguridad en API
Si deseas profundizar en JWT, seguridad de tokens y seguridad en API, te recomendamos los siguientes libros:
Keine Bücher für Kategorie "security" gefunden.



