¿Qué es JWT?

Si llevas un tiempo en el mundo del desarrollo web posiblemente hayas oído hablar en algún momento de JWT. Si deseas informarte sobre está tecnología, y conocer si necesitas integrarlo en tu proyecto te recomiendo que sigas leyendo

Introducción

Resumiendo mucho, se podría decir que JWT es un formato que nos puede ayudar cuando estamos creando una aplicación web dónde el usuario se puede loguear. Prácticamente cualquier aplicación web que uses a diario caería en esta categoría.

Si estás empezando en el mundo del desarrollo web posiblemente tus primeras aplicaciones las habrás elaborado siguiendo algún tutorial como por ejemplo el tutorial del tour de heroes de angular, y no habrán requerido hasta el momento que el usuario se encuentre logueado.

Pero a poco, que hayas seguido avanzando, y te hayas ido planteando desafíos mas exigentes, te habrás encontrado con la necesidad de utilizar algún sistema de permisos y roles que permita por ejemplo que un cliente pueda revisar sus últimos pedidos, o un administrado pueda ver estadísticas sobre las ventas, en el caso de una aplicación de comercio electrónico.

Historía y evolución de JWT

Dado que las aplicaciones web trabajan sobre el protocolo HTTP el cual es un protocolo sin estado, el servidor trata cada petición de forma independiente y no existe ninguna forma a priori de que el servidor pueda saber que una serie de solicitudes pertenecen a un mismo usuario.

Para solucionar esto al principio se elaboro una solución basada en cookies de sesión, en dónde el servidor generaba una cadena aleatoria de carácteres que identificaba de forma única cada sesión de cada usuario. En la parte de cliente esta cadena se almacenaba en una cookie la cual era enviada en cada petición que el usuario hacía al servidor web.

Desgraciadamente este sistema tenía un inconveniente. El servidor requería almacenar estas cookies de sesión, generalmente en una base de datos, aumentando con ello el consumo de recursos de dicho servidor.

Afortunadamente a alguien se le ocurrió una forma mas elegante de solucionar esto haciendo uso del concepto de firma digital. Este es el tema que nos ocupa: JWT

Funcionamiento básico de JWT

En esencia, un sistema que hace uso de JWT, funciona de la siguiente forma:

  1. El cliente se loguea usando usuario y contraseña
  2. El servidor comprueba que las credenciales son correctas y genera un “token” el cual firma digitalmente, el cual el cliente almacena para poder usar posteriormente en futuras peticiones
  3. El cliente hace una petición a algún recurso que requiere permisos, conjunto a la petición, envía el token que previamente había almacenado.
  4. El servidor comprueba que el token contiene una firma válida, y en caso afirmativo aporta la informacion solicitada.

Y a partir de aquí se podrá repetir los paso 3 y 4 y el cliente podrá hacer las solicitudes que quiera hasta que el token caduque, y requiera solicitar un nuevo token.

Normalmente lo que se hace es generar dos token, uno que será el el que se enviará normalmente y otro que solo se usará para renovar el primer token, y así evitar tener que pasar otra vez por los pasos 1 y 2.

Cómo se genera un JWT token

Un JWT está formado por tres partes:

  1. Cabecera (Header): Dónde se almacena el tipo de criptografía que se usará en la firma
  2. Carga (Payload): Dónde puedes venir cualquier información, generalmente el nombre de usuario y los roles que posee
  3. Y firma (Signature): Dónde vendrá los datos de la carga firmados usando el algoritmo criptográfico definido en la cabecera.

Una vez calculadas estas tres partes, son codificadas individualmente usando Base64 y unidas usando un punto, formando algo como:

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IlJ1IEVzY3JpYmFubyIsImlhdCI6MTUxNjIzOTAyMn0.OFmiNqLkzGjZqbiFDwcooSXWYLYG8T9LYQHdPOycO_0

Puedes jugar con https://jwt.io/ para ver como se genera un JWT token

Pues esto es todo. Si te ha gustado o te ha quedado alguna duda. Por favor deja un comentario.