En este ¿Sabías qué? vamos a hablar de JSON Web Token o JWT, un estándar que permite la autenticación digital de usuarios. A continuación, explicamos para qué se utiliza y cómo funciona.
JWT es un estándar definido en la RFC 7519 y provee un mecanismo para poder enviar datos confiables entre dos partes, ya que va firmado digitalmente. Por ejemplo, si dos usuarios se han intercambiado previamente claves, uno de ellos puede enviar un mensaje en un JWT y, al recibirlo, el otro usuario podrá validar que su contenido es legítimo (es decir, que nadie ha modificado el contenido del mensaje).
El caso de uso más típico consiste en enviar los datos del usuario de una API (su identificador, nombre, permisos, etc.). Pero, por supuesto, se puede utilizar para muchas otras cosas. Tiene esta pinta:
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2NTk1MzkyNjksImp0aSI6IlZFN0VrZU5FdXdRY1ZWUjRVRFVDdmZEejZsV1RmK0hESTFUK082cHRmS0U9IiwiaXNzIjoiT3ZlcmxvcmRKcyIsImF1ZCI6ImJDdWJlTlgiLCJuYmYiOjE2NTk1MzkyNjksImV4cCI6MTY2MDE0NDA2OSwicGF5bG9hZENsYXNzIjpudWxsLCJwYXlsb2FkIjp7ImlkIjozNDI1MzU0LCJ1c2VyIjp7ImlkIjozNDI1MzU0LCJuYW1lIjoib3BlcmF0b3IiLCJhdmF0YXJVcmwiOiJodHRwczovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwP2Q9aHR0cHMlM0ElMkYlMkZleGFtcGxlLmNvbSUyRmltYWdlcyUyRmF2YXRhci5qcGcifX19.B1MuL4XZ7144uPSgTXQVoheyVzFk3x2ZXT0Ji8SkBgxENQM5YrbeiBiD2n9WBxl8--Vq5i2_Vi_mVAFKHQg6Ow
El token no es más que una cadena de texto que consta de tres segmentos, separados por punto (.) y codificados en Base64. Los tres segmentos son los siguientes:
- Encabezado. Donde se indica el tipo de token y el algoritmo de codificación empleado.
- Payload. Los datos que queremos transmitir.
- Firma. Es una cadena que se crea a partir del encabezado, el payload y una clave privada, y que es la que permite validar si el token es legítimo o los datos han sido contaminados.
Para comprobar si el token es o no legítimo, se puede utilizar la herramienta de depuración online: https://jwt.io/.
Vamos a decodificar el ejemplo anterior:
- En el encabezado, el token es de tipo JWT y el algoritmo es HS512.
- Los datos son los siguientes:
El campo "nfb" indica la fecha a partir de la cual el token está vigente , "exp", el momento en el que caduca e "iat", la fecha en la que se generó el token. El campo "iss" nos dice quién emitió el token y "aud", a quién se dirige. El campo "jti" pretende ser un identificador único de token. En lo que respecta al resto de campos, éstos son arbitrarios.
Tanto el encabezado como los datos son visibles si hacemos base64decode. No se necesita ninguna clase para descifrarlos, así que no deberíamos enviar información sensible.
- Gracias a la firma, sabremos si nos podemos fiar de esos datos.
Longitud del token
Hay que tener en cuenta que, si metemos muchos datos en el payload, el tamaño del token crecerá proporcionalmente y puede provocar distintos efectos, dependiendo del contexto en el que se utilice:
- En la transmisión de datos: si el token JSON es demasiado grande, puede causar problemas de rendimiento y demoras en la transmisión de datos.
- En el procesamiento de datos: puede producir problemas de memoria y de rendimiento.
- En la legibilidad del código: los desarrolladores tendrán más problemas para entender el código y mantenerlo.
Por tanto, es recomendable mantener los tokens JSON lo más cortos posible, para evitar problemas de rendimiento y legibilidad de código. Si no queda más remedio que utilizar un token grande, se pueden utilizar técnicas de compresión y fragmentación para reducir su tamaño y mejorar así su eficiencia en el procesamiento y transmisión de datos
Federico Javier Álvarez Valero es Arquitecto de Software de Bitban Technologies.