Autenticación basada en Cookie/Session vs Token

Introducción

Como ya sabemos, "Http" es un protocolo stateless, es decir, no contiene información de las llamadas anteriores. Sin embargo, cuando desarrollamos una aplicación que tiene autenticación generalmente necesitaremos almacenar la autenticación del usuario para evitar tener que mandar el usuario y contraseña en cada una de las peticiones realizadas. Para resolver este problema podemos utilizar la autenticación basada en cookie/session o en token.

Autenticación basada en Cookie/Session

En la figura que tenemos a continuación podemos ver un diagrama de secuencia que ilustra el funcionamiento de la autenticación basada en cookie. 
Diagrama de secuencia UML que ilustra el proceso de autenticación basado en cookie
  1. Un usuario se autentica con su nombre de  usuario y contraseña. Esta información es recibida por el servidor que comprueba que es correcta, generando y almacenando un identificador de sesión. 
  2. El servidor retorna este identificador al navegador para que lo almacene en una cookie.  
  3. En cada petición realizada a continuación el navegador mandará la cookie con la petición. Esto evita tener que autenticarnos en cada petición.
Al cerrar la sesión el usuario, el servidor eliminará el identificador de sesión y enviará una petición al navegador para eliminar la cookie almacenada.
Se trata por tanto de una autenticación stateful, es decir, se mantiene información de la sesión en el servidor. El almacenamiento necesario en el servidor aumenta conforme el número de usuarios crece o incluso cuando un mismo usuario se conecta desde diferentes dispositivos.

Autenticación basada en Token

Diagrama de secuencia UML que ilustra el proceso de autenticación basada en token
  1. Un usuario se autentica introduciendo su nombre de usuario y contraseña. El servidor recibe estos datos y crea un token con la información del usuario.
  2. El token es devuelvo al usuario para ser almacenado en su navegador.
  3. En las peticiones posteriores el navegador envía el token en la cabecera de la petición, en la propiedad Authorization con valor "Bearer " + token.
Los tokens solucionan los problemas que pueden aparecer con el CORS cuando tenemos que trabajar con peticiones a través de diferentes dominios.
Se trata de una autenticación stateless. El servidor no almacena ningún tipo de información. Es el navegador el encargado de almacenar el token.

JSON Web Tokens

JWT es uno de los tipos de token que podemos encontrarnos. Como se puede ver en la siguiente imagen está dividido en tres partes:

  • Header: Tiene información sobre el algoritmo de encriptación y el tipo de token.
  • Payload: Contiene la información del token.
  • Signature: Nos permite validar el token para comprobar que no ha sido manipulado.
Ejemplo token JWT