Introducción a JSON Web Tokens (JWT)

¿Qué es un JSON Web Tokens?

JWT es el acrónimo de JSON Web Tokens es un estándar (RFC 7519) basado en JSON y que podemos definir como un contenedor que almacena toda la información que hace referencia a la autentificación de un usuario y/o intercambio de información. Es decir, nos permite segurizar, con esto nos referimos a realizar autentificación y autorizaciones para las comunicaciones que realizamos entre cliente y servidor mediante a tokens de acceso de una manera segura y confiable.

Estos tokens de acceso que creamos dentro de nuestro servidor (en nuestra aplicación) nos permiten propagar/comunicar/transmitir/difundir la identidad y los privilegios (en inglés conocidas bajo el nombre de claims) que un usuario obtendrá unos privilegios (por ejemplo de administrador o de usuario) dentro de nuestra aplicación.

Estructura de un Token Web JSON (JWT)

JWT representa una secuencia de valores codificados en base64url que están separados por caracteres de punto.

El contendor tendrá la siguiente estructura:

Header/JOSE + “.” + Payload/Claims + “.” + Signature/Firma

Si analizamos más profundamente la anatomía de un contenedor, podremos comprobar que un token JWT está compuesto por 3 partes:

Header de un token JWT

  • Header (encabezado): la primera parte de la firma, está codificada en base64encoding. Este encabezado contiene los metadatos que se encargaran de definir la tecnología criptográfica que aplicaremos sobre el token. Este header, se bautizó como JOSE debido a que son las iniciales de JavaScript Object Signing and Encryption. Los metadatos comunes que contendrá el token serán el de tipo de token que será TOKEN TYPE (“typ”) y el algoritmo de cifrado ALGORITHM (“alg”). El header se utiliza para definir la encriptación y el tipo de cifrado del token. Por tanto, y en resumen, el header contiene toda la información de cómo se debe calcular/cifrar la firma.
    • Un ejemplo de Header podría ser: { “alg”: “HS256”, “typ”: “JWT” }

Compilado a base64Encoded el resultado será: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Los campos que podemos añadir al header son:

Código NombreDescripción
typToken type Si está presente, se recomienda utilizar el valor JWT.
cty Content type En casos normales, no es recomendado. En casos de firma o cifrado anidado, debe está presente y el valor debe ser JWT.
algMessage authentication code algorithmEl proveedor de identidad puede elegir libremente el algoritmo para verificar la firma del token, aunque algunos de los algoritmos soportados son inseguros.

Los tipos de algoritmo de cifrado “alg” que podemos usar en java son:

Payload de un token JWT

  • JWT Payload (carga útil) o también conocidos como JWT Claims (peticiones/reivindicaciones): la parte central de la firma, contiene la lógica de negocio. Esta lógica, almacena en una serie de tributos en formato JSON (clave, valor) que se encriptan en el token.
    • Dentro del Payload tenemos los JWT Claims tenemos dos grupos:
      1. Los que nosotros creamos y le damos nuestro propio código y sobre los que escribimos un valor:
        1. Un ejemplo podría ser: {“web”: “javadesde0.com”}
      2. Los que ya están predefinidos y tienen un significado común, como son:
Código Nombre Descripción
issIssuer Identifica el proveedor de identidad que emitió el JWT.
subSubject Identifica al sujeto (el nombre o quién) del token JWT.
audAudience Identifica los destinatarios (audiencia o receptores) para los que está destinado/emitido el token JWT.
Cada servicio que recibe un JWT para su validación tiene que controlar la audiencia a la que el JWT está destinado.
Si el proveedor del servicio no se encuentra presente en el campo aud, entonces el JWT tiene que ser rechazado.
expExpiration Time Identifica el tiempo/ la fecha de vencimiento después del cual el JWT no tiene que ser aceptado para su procesamiento.
nbfNot Before Identifica el momento en que el token comenzará a ser aceptado para su procesamiento. 
Identifica el tiempo/la fecha temporal en que el JWT comienza a ser válido. EL JWT no tiene que ser aceptado si el token es utilizando antes de este tiempo.
El valor debe ser un NumericDate.
iatIssued at Identifica la hora a la que se emitió el token, en la que fue emitido. El valor debe ser un NumericDate.
jtiJWT ID Identificador único del token incluso entre diferentes emisores.

Los nombres de los reclamos tienen tan solo tres caracteres, esto se produce debido ya que JWT debe ser compacto.

Un ejemplo de Payload podría ser:

Compilado a base64Encoded el resultado será: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

Signature de un token JWT

  • Signature (firma de seguridad): la parte final de la firma, también está codificada en base64encoding.
  • Los JWT se pueden firmar usando:
    • JWT secreto (con el algoritmo HMAC) se suele usar cuando se realizan autentificaciones de usuarios.
      • Esta es la parte más es la más complicada de entender debido a que tiene dos fases:FASE 1: almacena el var str = base64Encode(header) + “.” + base64Encode(payload);
        FASE 2: almacena var signature = hadAlgRS256(str, secret);
        En muchos sitios es muy común ver ambas fórmulas combinadas dando como resultado:HMAC(base64UrlEncode(Header)+”.” +base64UrlEncode(payload), signature) En nuestro caso en concreto la signature será:HMAC-SHA256(key, unsignedToken) debido a que el alg de nuestro Header es “SHA256”.
      • Hay que destacar que el HMAC contiene la firma que ha realizado el servidor. Esta firma se calcula concatenando el header codificado en base64, el payload codificado también base64 y finalmente la signature.

Todo el contenido de esta firma (base64UrlEncode(Header)+”.” +base64UrlEncode(payload), signature), finalmente si nos fijamos en el formato de la signature es firmado por el tipo HMAC que no es nada más y nada menos que Es la parte encargada de realizar la comprobación para

Un ejemplo podría ser:

  • O un par de claves pública / privada usando RSA o ECDSA. Se suelen usar para la transmisión de información.
    • Un ejemplo de RSA podría ser:

¿Cuándo usar JSON Web Tokens?

Los dos escenarios principales sobre los que utilizan JSON son:

  • Autorización: es el escenario más usual, el que más frecuentemente utilizaremos para utilizar JWT. Consiste en que un usuario realice una solicitud de inicio de sesión donde se crea un token JWT mediante al cual podrá acceder a rutas, servicios y recursos que estén permitidos con dicho token.
  • Intercambio de información: este escenario es menos común que el anterior, pero ideal en las situaciones en las que buscamos transmitir información de forma segura entre varias partes (emisor-receptor). Los ficheros JWT pueden firmarse, mediante a claves públicas y privadas, con el fin de garantizar que los remitentes son quien dicen ser. Además, como la firma se calcula utilizando el encabezado (header) y la carga útil (payload), también podemos verificar que el contenido no haya sido alterado.

Ciclo de vida de una petición JWT

  1. El usuario lanza una petición (GET, POST, DELETE…).
  2. El servidor comprueba si existe un token y en caso contrario lo crea y lo firma con JWT.
  3. El servidor devuelve el token al navegador.
  4. El cliente (Browser) ya dispone de un token y cada vez que vuelva a realizar una petición enviará este token dentro de la cabecera de la petición la autorización JWT.
  5. Se comprueba que la firma JWT contiene una autorización valida.
  6. Se envía una respuesta al cliente.

Antes de salir del servidor, si nos fijamos el token es firmado por el server. Esto se produce debido a que de esta manera, garantizamos que el token será firmado primeramente por el servidor con la finalidad de que cuando el browser lo ponga en su cabecera y nos lo envié de nuevo podemos comprobar si ese token JWT es válido o no. Para finalmente mandar una respuesta al cliente.

Authentification vs Authorization

Más adelante trabajaremos con estos dos conceptos y los tokens a modo de introdución os dejamos su significado:

  • Autenticación: Proceso a través del cual un cliente garantiza su identidad. El ejemplo más sencillo sería el uso de usuario y contraseña.
  • Autorización: Proceso a través del cual se determina si un cliente tiene autoridad, o autorización, para acceder a ciertos recursos protegidos.

¿Puede influir el tamaño de un token en su rendimiento?

El tamaño de los datos que introduzcamos dentro del token de JWT, como norma general no serán un problema, pese a ello, si sobrecargamos un token aumentamos excesivamente sus dimensiones. Esto podría suponer que afecte negativamente al rendimiento de la aplicación y que cause algo de latencia. Pero solo en casos puntuales. Un ejemplo de un token XXL podría ser:

Descomprimiendo un token JWT

Aunque los tokens firmados, tienen la información protegida contra su manipulación, son legible por cualquier persona. 
Por lo que se desaconseja colocar en los elementos de carga o encabezado de un JWT información personal como contraseñas debido a que aunque esté encriptado se puede desencriptar o lo deberías de encriptar nuevamente y posteriormente desencriptarlo.

Vamos a ver un ejemplo. Si tenemos el siguiente token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJ3ZWIiOiJ3d3cuamF2YWRlc2RlMC5jb20ifQ.InWtMlwPl6f5vmNKx1utWYvQihEDtkgsi8sc1Na07y0

Y vamos a la web oficial de JWT: https://jwt.io/

Podemos pegar el token dentro del encoded o crear un token desde el lado del decoded y copiar el token posteriormente.

Si ahora intentamos modificar el token y cambiar el carácter inicial del token anterior que es una “e” por una “a”, podemos ver que nos indica que la signature es inválida:

Esto se produce como ya hemos visto debido a que por la forma de cómo se calcula el token evita que lo modifiquemos desde fuera.

Beneficios de los tokens JWT

Algunos de los beneficios de los tokens JWT son:

  • No utilizan cookies, son más seguras y más escalables: Las aplicaciones que utilizan JWT, permiten que los servidores acepten solicitudes simplemente validando el contenido de estos token JWT. Esto supone el beneficio de no tener que utilizar cookies lo que hace a las aplicaciones más seguras y más escalables debido a que podemos añadir hasta contenido directamente del Payload de los contenedores JWT. Evitando que usuario pueda visualizar directamente las coockies/datos de sesión de usuarios desde su navegador y aunque se puede ver descompilando el token JWT se lo ponemos algo más difícil y solo lo podrá ver no modificar.
  • Rendimiento sólido: JWT tiene la capacidad de poder introducirse en el encabezado de una petición/solicitud http. Lo cual nos otorga ciertos beneficios sobre otros mecanismos de identificación.
  • Compacto: JWT es simplemente un objeto JSON que utilizamos para transmitir información, que previamente se codifica mediante a un algoritmo. Buscamos que este objeto almacene la información de una manera bastante compacta, bastante comprimida con el fin de que realice lo más rápido posible la transmisión de la información. Está petición contendrá el token en el encabezado y se realizará mediante al protocolo HTTP.
  • Fácil de descompilar y de leer: los tokens JWT como acabamos de ver son sencillos de descompilar y dan como resultado un JSON que tiene una estructura bastante simple de interpretar.
  • No permite la modificación: por el sistema de cómo se crea el token JWT no podemos modificar el token sin que nos dé un error.

Conclusión

Bueno esto ha sido todo por el momento espero que os haya gustado y ya hemos entrado en el maravillo mundo de los tokens JWT aunque esto simplemente es una introducción, ampliaremos el tema ya que me parece muy interesante.

3 comentarios

  1. Whoa! This blog looks just like my old one! It’s on a completely different subject
    but it has pretty much the same page layout and design.
    Great choice of colors!

  2. Undeniably believe that that you stated. Your favorite
    justification appeared to be at the internet the easiest factor to take note of.
    I say to you, I certainly get irked whilst other people consider
    worries that they plainly do not recognize about. You controlled to hit the nail upon the highest and defined out the whole thing without having
    side-effects , other people could take a signal.
    Will probably be back to get more. Thanks

  3. Attractive element of content. I just stumbled upon your site and in accession capital to claim that
    I acquire in fact enjoyed account your weblog posts.
    Any way I will be subscribing in your feeds or even I success you get right of entry to constantly quickly.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

La Ley 34/2002 nos obliga a avisarte de que usamos cookies propias y de terceros con objetivos estadísticos y de sesión y para mostrarte la 'publi' que nos da de comer. Tranquilo, este mensaje solo sale una vez. Más información

Java desde 0 comunica a los usuarios, a través de este aviso, que puede utilizar cookies cuando el usuario navega por las diferentes pantallas y páginas del sitio. Durante el uso de nuestra página Web usted acepta y autoriza expresamente el uso de cookies, de acuerdo con nuestra Política de Privacidad. Este sitio web utiliza las siguientes cookies propias: - Cookies de sesión, para garantizar que los usuarios que escriban comentarios en el blog sean humanos y no aplicaciones automatizadas. De esta forma se combate el spam. Este sitio web utiliza las siguientes cookies de terceros: - Google AdManager y AdSense: Utiliza cookies para mejorar la publicidad. Entre otros fines, suelen utilizarse para segmentarla según el contenido que sea relevante para los usuarios o su ubicación, mejorar los informes de rendimiento de las campañas y evitar mostrar anuncios que los usuarios ya hayan visto. Las cookies no contienen información personal identificable. Consulta cómo utiliza Google la información de sitios web o aplicaciones. y cómo bloquear determinados anuncios. - Google Analytics: Almacena cookies para poder elaborar estadísticas sobre el tráfico y volumen de visitas de esta web. Al utilizar este sitio web está consintiendo el tratamiento de información acerca de usted por Google. Por tanto, el ejercicio de cualquier derecho en este sentido deberá hacerlo comunicando directamente con Google. - Redes sociales: Cada red social utiliza sus propias cookies para que usted pueda pinchar en botones del tipo Me gusta o Compartir.

Cerrar