JWTs o Cookies de sesion El Dilema de la Autenticación en Entornos Web

JWT o Cookies de Sesión: El Dilema de la Autenticación en Entornos Web 

Una de las partes más importantes de cualquier aplicación o sistema web, suele ser habitualmente la autenticación.  

La Autenticación y la Autorización

autenticación y autorización

La autenticación es el proceso mediante el cual un sistema verifica la identidad de un usuario o dispositivo. Además de la autenticación, existe el proceso de autorización. El proceso de autorización valida si dicho usuario o dispositivo tiene permisos para acceder a un recurso específico

Cuando trabajamos en el sistema de autenticación, el principal problema con el que debemos lidiar es que HTTP no tiene estado. Cada solicitud es independiente y no contiene ningún contexto sobre las solicitudes anteriores. Entonces ¿cómo gestionamos las solicitudes que se realizan después de superar la autorización? 

Cookies de Sesión y JWT: Dos Opciones de Autenticación

Aquí es donde entran en juego las Cookies de Sesión y JWT (Json Web Token). Para un sistema web y experiencia de usuario óptimas, deberemos elegir cómo gestionar a los usuarios autenticados. Y tener en cuenta los pros y contras de elegir una opción u otra. 

Autenticación basada en Cookies de Sesión

La autenticación basada en cookies de sesión es la que se lleva a cabo cuando el usuario introduce sus credenciales y el servidor genera un registro persistente que representa esta sesión de navegación. 

Este registro suele incluir un identificador primario, uno para el usuario. También incluye la fecha y hora de inicio de sesión, la dirección IP y el UserAgent del cliente. Esta información se guarda en la base de datos. El identificador de la sesión se envía de vuelta en la respuesta a la solicitud HTTP. Así, se almacena como Cookie en el navegador del usuario. A partir de aquí, cada solicitud incluirá el identificador de sesión. Esto permite al servidor verificar su validez y decidir sobre los datos o información que debe devolver. 

Ventajas y Desventajas de la autenticación basada en Cookies de Sesión

Es importante conocer las ventajas y desventajas de la autenticación basada en Cookies para tomar la decisión adecuada según nuestras necesidades.

ventajas y desventajas2

Empecemos por las ventajas:

  • Simplicidad: Las Cookies de Sesión son fáciles de implementar y usar, lo que las hace adecuadas para aplicaciones con una estructura simple. 
  • Persistencia de la sesión: Las Cookies permiten a los usuarios mantener su sesión abierta incluso después de cerrar el navegador, lo que brinda comodidad y mejora la experiencia del usuario. 
  • Escalabilidad: Para aplicaciones con alta concurrencia, el uso de Cookies de Sesión puede aliviar la carga del servidor al almacenar información de autenticación en el cliente, lo que permite gestionar un mayor número de usuarios. 
  • Control de sesiones: Las Cookies permiten a los administradores de sistemas revocar o manipular sesiones de usuarios de forma más sencilla, lo que mejora la seguridad. 

Sin embargo, la autenticación basada en Cookies también tiene sus inconvenientes a considerar antes de tomar decisiones.

  • Riesgo de seguridad: Las Cookies de Sesión pueden ser vulnerables a ataques de suplantación de identidad si no se gestionan correctamente. Un robo de Cookies podría permitir el acceso no autorizado a la cuenta del usuario. 
  • Problemas de privacidad: Las Cookies pueden almacenar información personal del usuario, lo que plantea preocupaciones de privacidad si se utilizan de manera inadecuada o se almacenan datos confidenciales 
  • Compatibilidad del navegador: Las Cookies pueden funcionar de manera inconsistente en diferentes navegadores, lo que puede llevar a problemas de usabilidad. 
  • Complejidad de la administración de sesiones: La administración de sesiones con Cookies puede ser más compleja a medida que crece el tamaño de la aplicación, lo que requiere una planificación y organización adicionales. 

Autenticación basada en JWT (Json Web Token)

Otra opción de la que disponemos a la hora de realizar y mantener la autenticación en nuestros entornos web, es utilizar JWT, o lo que es lo mismo Json Web Token

Este flujo también comienza cuando el usuario proporciona algún tipo de credenciales y el servidor las utiliza para autenticar dicha solicitud, sin embargo, la gran diferencia con respecto a la autenticación basada en Cookies (donde almacenamos el estado de la sesión y lo buscamos o recuperamos en cada solicitud), es que con JWT todo este contexto es autónomo en la cadena que se envía de vuelta al cliente, y se puede recuperar información de la misma sin necesidad de consultar a base de datos, simplemente la información que necesotamos está en el Token, y si tenemos permisos podremos leerla.

Dicho de otro modo, los JWT son objetos JSON que siguen un estándar y que son generados y firmados en el proceso de autenticación, garantizando que se puede confiar en ellos. 

Componentes de un JWT

Si analizamos un JWT, podremos ver que constan de tres partes: el encabezado, la carga útil y la firma. Cuando los servidores reciben los JWT pueden verificar que no ha sido manipulado, ya que la firma del JWT contiene el encabezado original y los datos de la carga útil. 

La parte de la carga contiene tres elementos relacionados con el usuario, los permisos y la expiración. El usuario es la identidad para la que se emitió el JWT. Los permisos son los asociados al mismo. La expiración es el tiempo de vigencia del token.

La información sobre el algoritmo usado para firmar o cifrar el token está en el encabezado. Tanto el encabezado como la carga útil se codifican en base64. La parte de la firma se crea de esta forma. Se combina el encabezado y la carga útil. Luego, se aplica un hash a esa combinación con una clave secreta. Esto permite detectar si alguien ha manipulado las notificaciones tras firmar el JWT.

En los sistemas distribuidos esta operación se realiza con una firma asimétrica. El servidor que emite el JWT usa una clave privada para cifrar el contenido. Luego, la audiencia puede utilizar la clave pública correspondiente para verificar que la carga útil actual es la misma que firmó el emisor. 

Ventajas y desventajas de la autenticación basada en JWT

ventajas y desventajas

A continuación, detallamos algunas ventajas y desventajas sobre el uso de JWT:

Empecemos por las ventajas: 

  • Seguridad: Los tokens JWT pueden ofrecer un nivel sólido de seguridad, ya que están firmados digitalmente y pueden cifrarse, protegiendo la integridad de la información de autenticación. 
  • Independencia del estado: Los tokens JWT son independientes del estado del servidor, lo que significa que no requieren que el servidor mantenga información sobre las sesiones de usuario. Esto facilita la escalabilidad. 
  • Portabilidad: Los tokens JWT pueden ser utilizados en diferentes sistemas y servicios, lo que los hace ideales para aplicaciones distribuidas y microservicios. 
  • Información personalizada: Puedes incluir datos personalizados en el token JWT, lo que permite una fácil personalización de las sesiones y roles de usuario. 
  • Rendimiento: Al eliminar la necesidad de almacenar información de sesión en el servidor, los tokens JWT pueden mejorar el rendimiento de la aplicación, ya que reducen la carga en el servidor. 

Por otro lado, también es recomendable conocer las desventajas o contras de la autenticación basada en Tokens: 

  • Imposibilidad de revocación: Una vez emitido, un token JWT es válido hasta que expire. No se pueden revocar de manera eficiente, lo que puede ser un problema en caso de que un token sea robado o comprometido. 
  • Complejidad: La implementación de JWT puede ser más compleja en comparación con las Cookies, especialmente en aplicaciones de gran escala. Requiere una gestión más detallada de tokens y claves. 
  • Privacidad: Dado que los tokens JWT contienen información sobre el usuario, existe un riesgo potencial para la privacidad si los tokens caen en manos equivocadas. 

Consideraciones finales y Seguridad

Como se puede apreciar, cada método tiene sus pros y sus contras. Por eso, es muy importante conocer los requerimientos del sistema a desarrollar. Así, podremos decidirnos por una opción u otra, o por una combinación de ambas si el sistema lo requiere. Entendemos que cada aplicación es única y que se debe evaluar la compensación entre seguridad y latencia. 

¿Ambos métodos son 100% seguros? 

Ambos métodos de autenticación se pueden considerar seguros, siempre y cuando nuestro sistema en conjunto lo sea. No todo depende solo de la autenticación. Debemos cuidar la generación y el almacenamiento de los JWT (si usamos esta opción). Sobre todo, debemos cuidar dónde los almacenamos.

Es habitual almacenar los JWT en el LocalStorage del navegador. En este caso lo mejor ser sería guardarlo en una Cookie con la opción de HttpOnly. Así evitamos que el Token esté accesible para el usuario o intruso. En la autenticación con Cookies, también es importante usar la opción de HttpOnly. Además debemos tener cuidado con nuestros métodos de API y el uso de verbos HTTP.

Añadir también que es muy importante revisar nuestro sitio web para prevenir ataques de tipo Cross-Site Request Forgery (CSRF). 

Conclusiones

La elección entre Cookies de Sesión y JWT para la autenticación en entornos web no es trivial. Cada uno tiene sus ventajas y desventajas, y la elección debe basarse en los requisitos específicos de tu aplicación.

Es importante considerar factores como la simplicidad, la seguridad, la escalabilidad y la privacidad al tomar una decisión. En algunos casos, una combinación de ambos métodos puede ser la solución óptima.

En última instancia, la seguridad de tu sistema depende de cómo implementes y administres la autenticación, independientemente de la opción que elijas. El equilibrio entre seguridad y latencia es esencial para brindar la mejor experiencia a tus usuarios y proteger sus datos.

Gracias por tomarte el tiempo de leer sobre el dilema de la autenticación en entornos web. Esperamos que esta información te ayude a tomar decisiones informadas y a diseñar sistemas web seguros y eficientes. Si tienes preguntas, necesitas asesoramiento o deseas discutir cómo podemos colaborar, no dudes en ponerte en contacto con nosotros.

Agustín Plaza Alcántara – Lead Developer at Itequia