Por qué JWT en la mayoría de los servicios de OAuth 2.0
Este artículo explica por qué JWT es ampliamente adoptado como el formato para los tokens de acceso en OAuth 2.0, destacando sus beneficios y limitaciones.
OAuth 2.0 es ampliamente utilizado hoy en día. Como un marco central para servicios de autorización, una de las principales responsabilidades de OAuth 2.0 es emitir tokens de acceso para los usuarios. Hemos notado que muchos proveedores de servicios de OAuth en el mercado emiten tokens de acceso en formato JWT.
En este artículo, presentaremos qué es JWT y por qué se adopta extensamente como el formato para los tokens de acceso emitidos por OAuth 2.0.
Introducción a JWT
JWT significa JSON Web Token, y está definido por RFC 7519 de la siguiente manera:
JSON Web Token (JWT) es un medio compacto y seguro para representar declaraciones para ser transferidas entre dos partes.
Esta definición deja claro que JWT es un token utilizado para pasar declaraciones entre diferentes partes.
Debido a que los JWT se pasan entre múltiples partes, están firmados para garantizar la integridad y autenticidad de los datos.
Un JWT firmado tiene el siguiente formato:
Consiste en tres partes separadas por .
: el encabezado, la carga útil y la firma.
Aquí hay un ejemplo de un JWT del mundo real:
Puedes intentar analizarlo en https://jwt.io:
Como se muestra en la imagen, la sección header
del JWT contiene información sobre el algoritmo de firma utilizado y el tipo de token. La sección payload
contiene las declaraciones llevadas por el JWT, y la signature
se utiliza para verificar la integridad del JWT.
Ahora que entendemos qué es un JWT y los significados de sus diferentes partes, procedamos a explicar por qué muchos servicios de autorización OAuth eligen JWT como su token de acceso.
Beneficios de usar JWT
Las distinciones clave entre los JWT y los tokens tradicionales basados en cadenas generadas aleatoriamente son que los JWT pueden llevar información y pueden ser validados a través de la decodificación. Estas diferencias traen dos ventajas significativas:
- Eficiencia de recursos: los JWT pueden llevar información sobre el usuario o la sesión, eliminando la necesidad de consultas frecuentes a la base de datos. Esta eficiencia puede reducir el consumo de recursos de los servicios.
- Mejora en la disponibilidad y escalabilidad: los JWT reducen la dependencia de la gestión de estado del lado del servidor. Esto permite que los servicios sean más sin estado, mejorando su disponibilidad y escalabilidad.
Al utilizar tokens tradicionales basados en cadenas aleatorias, el proceso típico para la verificación y autenticación es el siguiente:
Como se muestra en el diagrama, cuando un sistema tiene numerosos usuarios y muchos servidores de recursos diferentes, puede resultar en numerosas solicitudes de validación de tokens al servidor de autenticación.
Con el tiempo, a medida que el sistema crece, el servidor de autenticación puede convertirse fácilmente en un cuello de botella, planteando un desafío para la disponibilidad general del servicio.
Sin embargo, cuando se introducen los JWT, el proceso de validación cambia a:
Gracias a la característica de los JWT que permite la validación a través de la decodificación, el servidor de recursos puede verificar la integridad de los JWT y extraer información del usuario de ellos sin la necesidad de interactuar con el servidor de autenticación (Para más detalles sobre la decodificación y validación de los JWT, puedes consultar la documentación de Logto).
Limitaciones de los JWT
Aunque los JWT ofrecen ventajas significativas en arquitecturas de software modernas, también tienen limitaciones a considerar.
Carga fácilmente espiada
Como se mencionó anteriormente, un JWT consta de tres partes: el header
,payload
, y signature
.
¿Cómo se generan estos componentes? Vamos a tomar el JWT del ejemplo anterior y demostrar el proceso de generación del JWT:
Como se muestra en el código anterior, el encabezado y la carga útil del JWT simplemente se codifican como cadenas base64.
Esto significa que mientras alguien tenga acceso al token, puede fácilmente decodificar la cadena base64 de la carga útil del JWT y acceder a la información que lleva. Por el contrario, también es relativamente fácil falsificar una carga útil y reemplazar la carga útil original del JWT con una manipulada.
Si bien es cierto que la carga útil de un JWT puede ser relativamente fácil de falsificar, es importante tener en cuenta que la parte de la firma del JWT no se puede reemplazar con contenido falso, ya que requiere la clave de firma secreta. Por lo tanto, sin la firma correcta, el JWT no puede pasar la validación.
Por lo tanto, al utilizar JWT, es importante tener en cuenta las siguientes consideraciones:
- Siempre utilizar SSL: Para garantizar que la información de los JWT no se filtre durante la transmisión, es esencial utilizar SSL (Secure Sockets Layer) o su sucesor, TLS (Transport Layer Security), para cifrar los datos en tránsito.
- Evitar almacenar datos sensibles: No se recomienda almacenar datos sensibles en la carga útil del JWT. La carga útil se puede decodificar fácilmente, como se mencionó anteriormente, y debe contener principalmente declaraciones relevantes no sensibles.
- Validar los JWT: Antes de confiar en la información contenida dentro de un JWT, asegúrese de que haya pasado por un proceso de validación válido y seguro, incluyendo la verificación de la firma y el chequeo de la expiración del token. Esto ayuda a prevenir el uso de tokens alterados o no autorizados.
Difícil de revocar
En general, los tokens de acceso suelen tener un tiempo de expiración. Si el token de acceso se representa como cadenas aleatorias sin información, podemos verificar si el token ha sido revocado durante cada validación en el servidor de autenticación.
En cuanto a los JWT, debido a que los JWT contienen información de expiración dentro de ellos mismos, y al hecho de que la validación de los JWT no depende del servidor de autenticación, una vez que un servidor de autenticación emite un token de acceso en formato JWT, se vuelve imposible cambiar el estado del token durante su uso.
Después de que un token JWT expire naturalmente, podemos obtener un nuevo JWT del servidor de autorización usando un token de actualización (puedes consultar el blog de Logto para obtener información sobre los tokens de actualización).
Sin embargo, en ciertas situaciones, como cuando un usuario revoca la autorización o cambia su contraseña, y necesitas revocar un token ya emitido pero aún no expirado, no hay una solución directa disponible.
Existen dos enfoques comunes para mitigar el impacto de la revocación de tokens a mitad de camino:
- Establecer un tiempo de expiración más corto para el token de acceso y confiar en el mecanismo de actualización del token para actualizar rápidamente el estado del token.
Debido a que el token de acceso tiene un tiempo de expiración más corto, cuando un usuario descubre que el token de acceso ha expirado, puede solicitar un nuevo token de acceso por un token de actualización del servicio de autorización. De esta manera, el estado del token en el lado del usuario puede sincronizarse con el backend lo antes posible. Sin embargo, este enfoque conlleva una sobrecarga adicional, que los usuarios deben considerar.
- Mantener una lista de revocación para los tokens de acceso y verificar si el token está en la lista durante cada validación.
Este método tiene ciertas limitaciones. Una de las ventajas del JWT es que no requiere que el servidor almacene información de estado, y los JWT suelen ser sin estado. Sin embargo, mantener una lista de revocación requiere almacenamiento y mantenimiento efectivo, confiando en mecanismos de almacenamiento adicionales. Esto esencialmente sacrifica las ventajas del JWT y puede potencialmente llevar a problemas de rendimiento. Por lo tanto, el mecanismo de revocación de tokens necesita ser implementado por los desarrolladores de una manera que sea adecuada para su caso de uso específico.
Resumen
En este artículo, proporcionamos una breve introducción al JWT, destacando sus ventajas y limitaciones. A estas alturas, debería tener una comprensión más profunda del JWT y los escenarios en los que se utiliza comúnmente. Aunque el JWT tiene sus desafíos, los beneficios que ofrece cuando se utiliza como el formato de token en servicios OAuth 2.0 superan con creces sus inconvenientes.
Logto, como un servicio de autenticación de identidad en rápido crecimiento, también emplea JWT como el formato para sus tokens de acceso. Se adhiere estrictamente a varios protocolos de autorización y autenticación, lo que facilita de manera excepcional la integración de servicios de autenticación de identidad en sus productos. Logto ha lanzado oficialmente su servicio SaaS, y puedes probarlo gratis hoy.