JWT explicado: Estructura, seguridad y mejores prácticas
¿Qué es JWT?
Los JSON Web Tokens (JWT) son una forma estandarizada de enviar datos de manera segura entre dos partes. Contienen información (claims) codificada en formato JSON. Estos claims ayudan a compartir detalles específicos entre las partes involucradas.
En esencia, un JWT es un mecanismo para verificar la autenticidad de ciertos datos JSON. Esto es posible porque cada JWT está firmado criptográficamente para garantizar que su contenido no haya sido manipulado durante la transmisión o el almacenamiento.
Es importante señalar que un JWT garantiza la propiedad de los datos, pero no el cifrado. La razón es que el JWT puede ser visto por cualquiera que intercepte el token, ya que está serializado y no cifrado.
Se recomienda firmemente usar JWT con HTTPS, una práctica que se extiende a la seguridad web en general. HTTPS no solo protege la confidencialidad del contenido del JWT durante la transmisión, sino que también proporciona una capa de protección más amplia para los datos en tránsito.
Un JWT es simplemente una cadena de texto que tiene este aspecto:xxxxx.yyyyy.zzzzz
Tiene 3 partes:
Encabezado (Header): indica el tipo de token (JWT) y el algoritmo utilizado (como HS256).
Carga útil (Payload): contiene los datos reales (como ID de usuario, rol o permisos).
Firma (Signature): garantiza que el token no haya sido modificado por nadie.
¿Cómo funciona JWT?
Cómo funciona la autenticación con JWT
1. El usuario inicia sesión
Un usuario ingresa su nombre de usuario y contraseña.
El servidor verifica las credenciales.
Si son correctas, el servidor crea un JWT que contiene información del usuario (por ejemplo,
userId: 123, role: "admin") y lo firma con una clave secreta.
2. El token se envía al cliente
El JWT se envía de vuelta al cliente (normalmente en una respuesta de inicio de sesión).
El cliente lo almacena de forma segura (localStorage, sessionStorage o cookies).
3. El cliente envía el JWT con las solicitudes
Para cada solicitud a una API protegida, el cliente envía el JWT en el encabezado de autorización de esta manera:
Authorization: Bearer <JWT>
El servidor verifica el JWT
El servidor recibe el token.
Comprueba la firma usando la clave secreta:
Si es válida, confía en los datos del token (como el rol del usuario).
Si no es válida, rechaza la solicitud (401 No autorizado).
5. Acceso concedido o denegado
Si el token es válido y el usuario tiene los permisos correctos, el servidor permite el acceso.
Si no, el servidor deniega el acceso.
Ejemplo:
El usuario inicia sesión y obtiene un JWT:
{ "userId": 123, "role": "admin" }El usuario llama a
/admin/dashboardcon el token.El servidor verifica que role = "admin".
Acceso concedido.
JWT en microservicios, arquitecturas serverless y distribuidas
En los sistemas distribuidos o serverless modernos, los JWT destacan porque eliminan el estado de sesión compartido. Se puede emitir un token una sola vez y validarlo en todos los servicios sin necesidad de almacenamiento central de sesiones.
Mejores prácticas en contextos distribuidos:
Usar firma asimétrica (RS256 / ES256) para que los microservicios puedan validar sin compartir una clave secreta simétrica.
Incluir los claims audience (
aud), issuer (iss), jti (JWT ID) ynbf(not before) para prevenir ataques de repetición e usos indebidos.Combinar tokens de acceso de corta duración con rotación de tokens de actualización para limitar la exposición.
Esta sección ayuda a los lectores a comprender la escalabilidad y la seguridad real de JWT en sistemas distribuidos.
Para orientación sobre la actualización y revocación de tokens, consulten nuestra Lista de verificación de seguridad de API.
Estructura del JWT
La estructura de un JWT (JSON Web Token) está compuesta por tres partes principales, separadas por puntos (.):
Encabezado (Header)
Contiene metadatos sobre el token, como el tipo de token (
JWT) y el algoritmo de firma utilizado (por ejemplo,HS256,RS256).Ejemplo:
Carga útil (Payload)
Contiene los datos reales (llamados claims) que lleva el token.
Los claims pueden ser sobre el usuario (como
user_id,role) o metadatos del token (como el tiempo de expiración).Ejemplo:
Firma (Signature)
Se crea tomando el encabezado codificado y la carga útil codificada, y luego aplicando la clave secreta con el algoritmo especificado.
Garantiza que el token no haya sido manipulado.
Fórmula:
El JWT final tiene este aspecto:
xxxxx: Encabezado codificadoyyyyy: Carga útil codificadazzzzz: Firma
Ejemplo de JWT paso a paso:
Encabezado (antes de la codificación)
Después de la codificación Base64Url, pueden experimentar con la codificación Base64 usando nuestro Codificador Base64 o decodificar tokens existentes con el Decodificador Base64.
Carga útil (antes de la codificación)
Después de la codificación Base64Url:
Firma
Combinamos:
Base64UrlEncode(Header) + "." + Base64UrlEncode(Payload)
Luego lo hasheamos con HMACSHA256 y una clave secreta (por ejemplo, mysecretkey).
Resultado de ejemplo:
El JWT final tiene este aspecto:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImV4cCI6MTcxNjAwMDAwMH0.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
{Las dos primeras partes pueden decodificarse de nuevo a JSON (encabezado y carga útil), pero la firma solo puede verificarse con la clave secreta. Así es como JWT garantiza la integridad y la confianza.}
Escenarios de ataque comunes y cómo mitigarlos
A continuación se presentan los vectores de ataque comunes contra JWT y los pasos de mitigación accionables:
Ataque / Riesgo | Descripción | Mitigación |
|---|---|---|
Robo de token (XSS / acceso a localStorage) | Los atacantes roban el JWT almacenado en JavaScript del lado del cliente. | Usar cookies HTTP-only, configurar indicadores SameSite y preferir cookies Secure. |
Manipulación del algoritmo (ataque "none") | Un atacante fuerza | Rechazar tokens con |
Confusión o inyección de claves | Uso de claves de firma débiles o incorrectas. | Usar claves criptográficas fuertes, rotarlas regularmente y verificar el |
Ataques de repetición | Los tokens son capturados y reutilizados de forma maliciosa. | Incluir un |
Tokens de actualización, rotación y estrategias de revocación
Los JWT no admiten revocación de forma inherente, lo que hace que la renovación e invalidación de tokens sean fundamentales. A continuación se presentan estrategias para implementar flujos seguros de actualización y revocación de tokens:
Rotación de tokens de actualización: Emitir un nuevo token de actualización por cada solicitud e invalidar el anterior para reducir los riesgos de repetición.
Tokens de acceso de corta duración: Usar tiempos de expiración breves (por ejemplo, 5 a 15 minutos) y requerir actualización para continuar el acceso.
Lista negra / almacén de tokens: Mantener un almacén ligero de identificadores
jtirevocados para rechazar tokens comprometidos.Ventana de gracia y detección de reutilización: Permitir una pequeña ventana de superposición para la actualización, pero bloquear la reutilización de tokens de actualización antiguos.
Esto proporciona a los desarrolladores un plan claro para la gestión segura del ciclo de vida de los tokens.
Ejemplo: Crear y validar JWT en Python, Go y Java
Beneficios de JWT
Los principales beneficios de usar JWT (JSON Web Token):
Autenticación sin estado (Stateless Authentication)
Los JWT no requieren almacenar datos de sesión en el servidor.
El servidor solo verifica el token, lo que lo hace escalable y eficiente.
Compacto y rápido
Los JWT son pequeños en tamaño (en formato JSON), por lo que pueden enviarse fácilmente en encabezados, URLs o cookies.
Esto los hace rápidos de transmitir entre el cliente y el servidor.
Seguro (cuando se usa correctamente)
Los JWT se firman usando algoritmos como HMAC o RSA, garantizando la integridad de los datos.
No pueden manipularse a menos que se conozca la clave secreta o privada.
Compatibilidad entre dominios y plataformas
Los JWT funcionan bien en sistemas distribuidos, microservicios y APIs.
Pueden usarse en aplicaciones móviles, aplicaciones web y distintos dominios.
Autónomo
Los JWT contienen toda la información necesaria del usuario (claims) dentro del propio token.
Esto reduce las consultas repetidas a la base de datos para la autenticación.
Flexibilidad
Los JWT pueden almacenar datos personalizados (roles, permisos, tiempo de expiración).
Son útiles para el control de acceso y la seguridad detallada.
Ampliamente adoptado
JWT es un estándar (RFC 7519), compatible con muchas bibliotecas, frameworks e idiomas de programación.
En resumen, los JWT hacen que la autenticación sea más simple, rápida y escalable para las aplicaciones web y móviles modernas.
Conclusión
Construir y mantener un inventario de APIs adecuado y usar métodos de autenticación seguros como JWT ya no son opcionales: son esenciales para las organizaciones modernas. Un inventario de APIs actualizado brinda visibilidad a las empresas, mejora el cumplimiento normativo y fortalece la seguridad al garantizar que ninguna API pase desapercibida. Al mismo tiempo, JWT proporciona una forma escalable y segura de gestionar la autenticación, lo que hace que las aplicaciones sean más rápidas y fáciles de administrar.
Al combinar una gestión sólida de APIs con una autenticación confiable, las organizaciones pueden proteger sus activos digitales, reducir riesgos y mejorar la eficiencia. En Qodex.ai, creemos que la seguridad y la simplicidad deben ir de la mano, permitiendo a las empresas innovar sin comprometer la seguridad.
Preguntas frecuentes
¿Qué es un JSON Web Token (JWT) y para qué se utiliza?
Un JSON Web Token, o JWT, es un token compacto y firmado digitalmente que se utiliza para transmitir información de forma segura entre dos partes. Se usa ampliamente para la autenticación y la autorización en aplicaciones web, ya que permite a los servidores verificar la identidad del usuario sin almacenar datos de sesión. Los JWT contienen claims codificados, como roles de usuario o permisos, lo que ayuda a los sistemas a validar las solicitudes de acceso de manera eficiente mientras mantienen una comunicación sin estado.
¿Cómo funciona la autenticación con JWT en las aplicaciones modernas?
La autenticación con JWT funciona emitiendo un token después de que un usuario inicia sesión correctamente. El servidor codifica los datos clave del usuario y los firma con una clave secreta antes de enviárselos al cliente. Cada vez que el cliente realiza una solicitud, incluye el token, lo que permite al servidor verificar su autenticidad. Este proceso sin estado reduce las consultas a la base de datos, mejora la escalabilidad y simplifica la comunicación segura entre microservicios y APIs.
¿Cuáles son los componentes principales de un JWT?
Un JSON Web Token está compuesto por tres partes: el Encabezado (Header), la Carga útil (Payload) y la Firma (Signature), separadas por puntos. El encabezado define el algoritmo utilizado, la carga útil contiene los datos del usuario o los claims, y la firma garantiza la integridad del token mediante un hash criptográfico. En conjunto, estos componentes hacen que los JWT sean livianos y resistentes a la manipulación, lo que los convierte en una opción ideal para la autenticación segura y de alto rendimiento en sistemas distribuidos.
¿Es seguro almacenar JWT en localStorage o en cookies?
Almacenar JWT en localStorage o en cookies depende del modelo de seguridad utilizado. Aunque localStorage simplifica la gestión del token, expone los tokens a ataques XSS si el sitio no está correctamente saneado. Las cookies seguras con HTTP-only son generalmente más seguras, ya que impiden el acceso desde el lado del cliente. Para aplicaciones sensibles, combinar cookies con tiempos de vida cortos de token y tokens de actualización mejora la seguridad de JWT sin afectar la experiencia del usuario.
¿Cómo se comparan los JWT con los tokens OAuth?
Los JWT y los tokens OAuth frecuentemente trabajan juntos, pero cumplen roles diferentes. OAuth es un framework de autorización que define cómo los clientes obtienen tokens, mientras que JWT es un formato de token utilizado dentro de ese proceso. En esencia, OAuth proporciona las reglas y JWT proporciona la estructura. Las implementaciones OAuth basadas en JWT son preferidas para las APIs modernas porque reducen la sobrecarga y admiten una autenticación sin estado y fluida.
¿Cuáles son las mejores prácticas para proteger los JSON Web Tokens?
Para proteger los JWT de manera efectiva, usen siempre claves secretas fuertes o cifrado asimétrico, validen las firmas en cada solicitud y establezcan tiempos de expiración cortos. Eviten almacenar datos confidenciales en las cargas útiles, ya que los JWT solo están codificados en Base64, no cifrados. Implementen mecanismos de revocación de tokens y HTTPS para prevenir la interceptación. Seguir estas prácticas garantiza que la autenticación basada en JWT siga siendo escalable y conforme a los estándares modernos de seguridad de APIs.
Discover, Test, & Secure your APIs 10x Faster than before
Auto-discover every endpoint, generate functional & security tests (OWASP Top 10), auto-heal as code changes, and run in CI/CD - no code needed.
Related Blogs





