HTTP es un protocolo sin estado y se utiliza para transmitir datos. Permite la comunicación entre el lado del cliente y el lado del servidor. Originalmente se estableció para crear una conexión entre los navegadores web y los servidores web.
Entendamos esto con la ayuda de un ejemplo:
Supongamos que estamos comprando en línea, agregamos algunos artículos, por ejemplo. auriculares a nuestro carrito. Luego procedemos a buscar otros artículos, durante este tiempo, queremos que el estado de los artículos del carrito se almacene y no se pierda mientras se realizan otras tareas. Esto quiere decir que queremos que nuestros estados sean recordados durante toda la operación de compra.
Dado que HTTP es un protocolo sin estado, para superar esto, podemos usar sesiones o tokens. Este blog lo ayudará a comprender la diferencia entre los dos métodos de autenticación utilizados para la autenticación de usuarios.
Entonces, profundicemos en los conceptos de autenticación basada en sesión (cookie) y token, además de comprender la estructura de los tokens web JSON, es decir, JWT.
Antes de la aparición de JSON Web Tokens, usábamos predominantemente este tipo de autenticación.
En este tipo de método de autenticación, el servidor es responsable de la autenticación y el cliente no sabe qué sucede en el lado del servidor después de enviar una solicitud.
Entonces, ¿qué son las cookies de sesión?
La cookie creada anteriormente es una cookie de sesión : se elimina cuando el cliente se apaga, porque no especificó una directiva Expires o Max-Age. Sin embargo, los navegadores web pueden usar la restauración de sesión , lo que hace que la mayoría de las cookies de sesión sean permanentes, como si el navegador nunca se hubiera cerrado.
Leer más sobre las cookies HTTP
Comprendamos qué sucede normalmente cuando un usuario inicia sesión en cualquier sitio web en el navegador web. Por ejemplo, el usuario inicia sesión, el servidor creará una sesión para el usuario y almacenará los datos de la sesión en la memoria del servidor.
Se crea un ID de sesión que se almacena en una cookie en el navegador del cliente mientras el usuario realiza determinada actividad en el sitio web. En cada solicitud que realiza el usuario, se envía una cookie junto con ella.
Luego, el servidor puede verificar los datos de la sesión en la cookie con los datos de la sesión almacenados en la memoria del servidor cuando el usuario inició sesión inicialmente. Cuando el usuario cierra sesión en el sitio web, los datos de esa sesión se eliminan de la base de datos y de la memoria del servidor.
Autenticación basada en token
En la autenticación basada en token, usamos JWT (JSON Web Tokens) para la autenticación. Este es el método ampliamente utilizado para las API RESTful.
Aquí, cuando el usuario envía una solicitud de autenticación de usuario con los detalles de inicio de sesión, el servidor crea un token cifrado en forma de JSON Web Token (JWT) y lo devuelve al cliente. Cuando el cliente recibe un token, significa que el usuario está autenticado para realizar cualquier actividad utilizando el cliente.
El JWT se almacena en el lado del cliente, generalmente en localStorage, y se envía como una clave única de ese usuario cuando el usuario solicita datos del servidor o realiza alguna actividad para ese sitio web. Entonces, cuando el servidor recibe la solicitud, valida el JWT para cada solicitud de que es solo ese usuario en particular y luego envía la respuesta requerida al cliente.
Así es como se envía el encabezado junto con cada solicitud al servidor:
headers: { "Authorization" : "Bearer ${JWT_TOKEN}" }
El estado del usuario se almacena en el JWT en el lado del cliente. Cuando el usuario cierra la sesión, el token se elimina del lado del cliente (almacenamiento local). Por lo tanto, la mayoría de los datos se almacenan en el lado del cliente y se accede a ellos directamente en lugar de enviar solicitudes al servidor.
JSON Web Tokens consta de tres partes concatenadas por puntos (.):
Estructura JWT:
xxxxx.yyyyy.zzzzz
La salida contiene tres cadenas de URL Base64 separadas por puntos que se pueden pasar fácilmente en entornos HTML y HTTP, mientras que son más compactas en comparación con los estándares basados en XML, como SAML.
JWT que tiene el encabezado anterior y la carga útil codificados, y está firmado con un secreto como se muestra en la siguiente imagen.
En las aplicaciones web modernas, los JWT se utilizan ampliamente, ya que se escalan mejor que los basados en cookies de sesión porque los tokens se almacenan en el lado del cliente mientras que la sesión utiliza la memoria del servidor para almacenar los datos del usuario, y esto podría ser un problema cuando un gran número de usuarios están accediendo a la aplicación a la vez. Dado que JWT se envía junto con cada solicitud y contiene toda la información del usuario, aunque esté codificada, es necesario usar la información necesaria en JWT y la información confidencial debe evitarse o puede cifrarse para evitar ataques de seguridad.
No hay un método fijo para usar en todo momento, depende del desarrollador y el tipo de requisitos para determinar cuál debe usarse para qué escenario. Por ejemplo, OAuth usa un token de portador específico y un token de actualización de mayor duración para obtener el token de portador. Es mejor usar un híbrido de ambos tipos para crear flexibilidad y una aplicación robusta.
Espero que este artículo le brinde una buena comprensión de los dos tipos de autenticación ampliamente utilizados.
Para cualquier duda o sugerencia, comentar. :D