JWT vs Autenticación basada en sesiones
Aprende las diferencias entre la autenticación basada en sesiones y JWT. Explora compromisos, ventajas y casos de uso para elegir el esquema de autenticación adecuado para tus aplicaciones.
Aprende las diferencias entre la autenticación basada en sesiones y JWT. Explora compromisos, ventajas y casos de uso para elegir el esquema de autenticación adecuado para tus aplicaciones.
En general, el primer paso al usar una aplicación es la autenticación, donde el usuario final proporciona sus credenciales de identidad para iniciar sesión con éxito. Después de este paso, el sistema de identidad (es decir, el proveedor de identidad, el servidor de autenticación, etc.) sabe quién es el usuario y a qué recursos tiene acceso.
Dado que HTTP es inherentemente sin estado, cada solicitud en una sesión es independiente y no recuerda información de las anteriores. Volver a autenticar a los usuarios para cada acción es complicado y perjudica la experiencia del usuario.
Entremos en la autenticación basada en sesiones y autenticación JWT (JSON Web Tokens), dos métodos populares para mantener el estado de autenticación. Cada uno tiene ventajas y desventajas únicas, y la elección entre ellos depende de las necesidades específicas de tu aplicación. Si estás decidiendo entre los dos, esta guía está aquí para ayudar.
La autenticación basada en sesiones depende del servidor para mantener un registro del estado de autenticación del usuario. Al crear y gestionar sesiones, el servidor permite a los usuarios permanecer conectados e interactuar con una aplicación sin tener que volver a introducir credenciales con cada solicitud.
Creación de sesiones
SessionID se almacena en la base de datos y se devuelve al cliente del usuario como una cookie.Validación de sesiones
SessionID).SessionID consultando los datos de la sesión almacenados en el servidor.Las sesiones pueden invalidarse en tiempo real, lo cual es útil en situaciones donde es necesario un acceso rápido.
JSON Web Tokens (JWTs) adoptan un enfoque diferente al incorporar toda la información relevante del usuario directamente en un token, usando un objeto JSON. A diferencia de los métodos basados en sesiones, los JWT son sin estado, lo que significa que el servidor no gestiona registros de autenticación.
Un JWT consta de tres partes: un header, payload y signature.

Emisión de JWT
Los flujos basados en sesiones siguen un proceso similar. Sin embargo, después de la autenticación, la información del usuario se almacena en el servidor dentro de una sesión, mientras que los JWT dependen de los tokens enviados al cliente para su almacenamiento y uso posterior.
Validación de tokens
Authorization (Bearer <token>).La autenticación basada en sesiones requiere que el servidor consulte un almacén de sesiones, lo cual puede ser lento, especialmente si depende de bases de datos externas o centralizadas. En contraste, la autenticación JWT es sin estado, con toda la información necesaria almacenada en el token del cliente, y utilizando la firma para asegurar la seguridad. Esto elimina la necesidad de gestionar sesiones, haciendo que sea más rápido y escalable, especialmente en sistemas distribuidos.
En el lado del cliente, cerrar sesión generalmente significa limpiar la sesión local y eliminar tokens (ID, acceso, token de actualización) del almacenamiento. Sin embargo, para la autenticación JWT, esto solo cierra la sesión del usuario localmente, dejando intacta la sesión centralizada en el servidor de autorización. Como resultado, los usuarios aún pueden acceder a otras aplicaciones bajo la misma sesión hasta que el token expire o se termine manualmente.
Revocar un JWT (JSON Web Token) es más desafiante que la autenticación basada en sesiones porque los JWT son sin estado y no pueden invalidarse una vez emitidos, a menos que se implementen estrategias específicas. Los métodos comunes incluyen:
exp corto (por ejemplo, 15 minutos) para el JWT. Una vez vencido, el usuario debe volver a autenticar. Esto minimiza el riesgo si se compromete un token, ya que el atacante solo puede usarlo por un tiempo limitado. Para mantener una experiencia de usuario continua, se puede usar un token de actualización para minimizar la molestia de volver a autenticar.JWT no se actualizan en tiempo real
Una vez firmado un JWT, no puede revocarse ni actualizarse, y se considerará válido siempre que la firma sea válida y no haya expirado.
Si los permisos de acceso de un usuario cambian (generalmente se degradan), el usuario aún tendrá acceso eliminado a los recursos hasta que el JWT expire. Del mismo modo, si un JWT contiene información de autorización basada en roles, el nuevo alcance de autorización no surtirá efecto hasta que el antiguo JWT expire. En otras palabras, los JWT no son adecuados para la revocación en tiempo real y los usuarios pueden establecer un tiempo de expiración adecuado para mitigar este problema.
Dilema de múltiples dispositivos y revocación
No es posible validar todos los JWT emitidos antes de que expiren para implementar la revocación del usuario en todos los dispositivos. Mientras que teóricamente es posible revocar la clave de firma para invalidar el JWT, esto también invalidaría todos los JWT que usan esa clave, y el proceso de manejo de claves en caché hace que este enfoque no sea práctico para operaciones de revocación de usuario simples.
Algunos proveedores de identidad pueden tener soluciones preconstruidas para estos problemas de JWT. Para más información, consulta "Mejores prácticas para mejorar la experiencia de autenticación JWT.”
Las sesiones y los JWT son dos enfoques populares para persistir el contexto de autenticación y autorización en un mundo HTTP sin estado. Mientras que ambos enfoques tienen sus pros y contras, ofrecen beneficios y desventajas diferentes.
Las sesiones proporcionan garantías más fuertes para la autorización de solicitudes individuales y son más simples de implementar de forma segura. Sin embargo, su dependencia de la validación de base de datos del lado del servidor introduce una sobrecarga de latencia, lo cual puede afectar negativamente la experiencia del usuario para aplicaciones altamente responsivas.
Los JWT, por otro lado, son ventajosos para autorización más rápida e interoperabilidad con aplicaciones externas, pero requieren más esfuerzo del desarrollador para abordar las complejidades de seguridad. Por ejemplo, podemos usar webhooks para notificar a los clientes cuando se revoca el acceso del usuario, de modo que los clientes puedan limpiar el JWT almacenado en caché y hacer que el usuario vuelva a autenticarse.
Ya que la autenticación basada en tokens es más adecuada para escalar con sus desventajas aún manejables, está siendo adoptada por más y más aplicaciones modernas.
Tu método de autenticación debería coincidir con la arquitectura de tu aplicación y necesidades específicas. Aquí tienes una guía rápida para ayudarte a decidir:
La autenticación basada en sesiones funciona mejor cuando necesitas control de sesión en tiempo real, necesitas gestión centralizada o la escalabilidad no es una preocupación importante. Aquí es donde brilla:
Aplicaciones web con sesiones persistentes
Para plataformas como sitios web de compras en línea, las sesiones son esenciales para rastrear usuarios, carritos de compras y preferencias durante su visita.
Aplicaciones que requieren control de sesión en tiempo real
Aplicaciones como servicios bancarios o financieros se benefician de datos de sesión controlados por el servidor, asegurando una gestión de acceso robusta y segura.
Sistemas de un solo servidor o de pequeña escala
Herramientas internas o aplicaciones de pequeña escala sin necesidades de gran escalabilidad prosperan con una gestión de sesiones simple para facilitar el uso y la fiabilidad.
La autenticación JWT es más adecuada para aplicaciones que priorizan la escalabilidad, eficiencia y sistemas distribuidos. Es particularmente útil para interacciones sin estado entre clientes y servidores. Considera la autenticación basada en tokens para lo siguiente:
Single Sign-On (SSO)
Los JWT son perfectos para Single Sign-On, permitiendo a los usuarios autenticarse una vez y acceder sin problemas a múltiples servicios o aplicaciones usando el mismo token. Comparte una explicación detallada sobre aplicaciones seguras basadas en la nube usando OAuth 2.0 y OIDC, con formato JWT tanto para tokens de acceso como para tokens de ID.
Aplicaciones móviles
Las aplicaciones móviles a menudo prefieren los JWT para la autenticación, ya que los tokens pueden almacenarse de manera segura en el dispositivo y enviarse con cada solicitud API. Explora la integración rápida de autenticación JWT para Android / iOS.
Arquitecturas de microservicios
En entornos de microservicios, los JWT permiten que cada servicio valide de manera independiente el token sin depender de un almacén de sesiones central, asegurando escalabilidad y eficiencia.
Autenticación entre dominios
Los JWT sobresalen en escenarios que involucran múltiples dominios o subdominios (por ejemplo, api.example.com, dashboard.example.com, y docs.example.com). A diferencia de las cookies, los JWT permiten la autenticación a través de dominios sin dependencias adicionales.
APIs y servicios web
APIs RESTful y servicios web comúnmente usan JWT para la autenticación porque son livianos, portátiles y eliminan la necesidad de gestión de sesiones del lado del servidor. Aprende más sobre la autenticación máquina a máquina para escenarios donde tu aplicación necesita comunicarse directamente con recursos.
La autenticación JWT es una gran herramienta, pero puede venir con desafíos que afectan la experiencia del usuario. Logto ofrece una solución fácil y confiable para superar estos obstáculos, haciéndolo una elección superior para autenticación segura y eficiente.
Un problema común con la autenticación JWT es asegurar una experiencia de cierre de sesión de usuario adecuada. Logto simplifica este proceso con su SDK listo para usar.
Esto asegura una gestión de sesiones consistente y segura en todo tu ecosistema. Aprende más sobre los mecanismos de cierre de sesión y cómo implementar el cierre de sesión.
Gestionar cambios en tiempo real a los permisos de usuarios con JWT también puede ser complicado. Ya que los JWT son sin estado por diseño, cualquier permiso o rol actualizado puede no surtir efecto hasta que el token expire. Logto ofrece estrategias para manejar esto de manera efectiva:
Estas soluciones ayudan a mantener los permisos actualizados y aseguran un sistema más seguro y receptivo. Aprende más sobre cómo gestionar cambios en tiempo real a los permisos de usuarios.
Logto, que es una infraestructura de gestión de acceso a identidad escalable, proporciona una solución completa de identidad tanto con servicio en la nube como con versión de código abierto disponible.