¿Qué es JWT?

 

Escrito por Raúl Garvía Izquierdo, Arquitecto de soluciones de Cálculo, una compañía de Sapiens.

 

El siguiente artículo es el primero de tres, en los que pretendo presentaros JWT y cómo usarlo para la autorización de recursos en entornos web.

JSON Web Tokens (JWTs) son objetos JSON (Javascript Object Notation) que se usan para enviar información entre partes, normalmente un cliente web y un servidor, de manera segura. La especificación de JSON define la forma de crear objetos de texto plano en formato clave-valor. Por otra parte, JWT (publicado en RFC 7519) define un método para encapsular y compartir aserciones (claims) de manera segura utilizando los objetos JSON.

Los principales casos de uso de JWT son: proveer de mecanismos de identificación de usuarios, proveer de mecanismos de autorización de acceso a recursos, intercambio seguro de datos privados, intercambios de datos de sesión entre cliente y servidor, etc.

  1. Qué son los JWT

Son objectos JSON que están compuestos por cabecera (“header”), cuerpo (“payload”) y firma (“signature”).

Payload

Es el cuerpo del JWT y es un objeto json con la información enviada entre cliente y servidor, donde residen las aserciones mencionadas anteriormente (“claims”). Un ejemplo de payload podría el siguiente:

{

“name”: “Juan”,

“user”: “juan_garcia”,

“email”: “juan_garcia@undominio.es”,

“admin”: true

}

 

En este caso vemos información relacionada con un usuario, pero podría ser cualquier tipo de información a intercambiar entre un cliente y un servidor. No hay restricciones sobre la información a intercambiar, pero es importante saber que los JWT no están encriptados por lo que cualquier persona que intercepte el token podría leer su contenido. Por ello, es importante que la transmisión del token se realice sobre una conexión segura (https) y no indicar información sensible del usuario. Hay tres clases de nombres de aserciones: registrados, públicos y privados.

Nombres Registrados.

Están incluidos en el registro IANA “JSON Web Token Claims” que está establecido en la definición de JWT. No son obligatorios, pero son un buen punto de partida como conjunto de nombres útiles. Al ser abreviaturas se consigue el objetivo de representación compacta propia de JWT. Estos nombres son:

          • “iss” (Issuer) Claim: Creador del token.
          • “sub” (Subject) Claim: Sujeto del token.
          • “aud” (Audience) Claim:  Audiencia del token (a quien va dirigido).
          • ”exp” (Expiration Time) Claim: Tiempo de expiración.
          • “nbf” (Not Before) Claim: No antes de (tiempo desde que debe ser aceptado).
          • “iat” (Issued At) Claim: Creado a (tiempo en el que fue creado).
          • “jti” (JWT ID) Claim: JWT Id (identificador único).

Nombres Públicos

Son nombres personalizados pero públicos. Para evitar colisiones se recomienda que sean registrados en IANA JSON Web Token Registry.

                   Nombres Privados

Productores y consumidores de un JWT pueden acordar usar nombres de aserciones que son privados entre ellos.

Header

Describe las operaciones criptográficas aplicadas al JWT. Un ejemplo de cabecera sería:

{

  “alg”: “HS256”,

  “typ”: “JWT”

}

En este caso, podemos ver que el algoritmo usado para la firma del JWT es HS256. El receptor necesita saber qué firma/algoritmo se ha usado para así realizar la verificación.

Signature:

El contenido del payload es validado por el receptor de la información revisando la firma (signature). Es un Código de Autenticación de Mensaje (Message Authentication Code o MAC) y sólo puede ser generada por alguien que posea el mensaje enviado (payload y header) y una clave secreta. Usando los datos anteriores y accediendo a la página jwt.io (no es necesario hacerlo desde esta página web), podemos ver un ejemplo de JWT. La clave usada para la firma del payload ha sido “sup3rS3cr3t”.

En este caso, se usa una password porque el algoritmo elegido para firmar el token ha sido HS256, que es una función Hash, pero se pueden usar varios tipos de firmas. En el tercer post de la serie veremos cómo mejorar este mecanismo de firma. Un ejemplo de token con los datos mencionados hasta ahora, sería el siguiente:

 

 

Como vemos en el cuadro de la izquierda, se ha generado el token necesario. Como os adelantaba, el token se divide en tres partes (separadas por puntos) y la firma es la última. Se puede ver que el token es ininteligible al estar codificado en Base64URL. De esta forma se puede asegurar que al mandar el token por la red no haya problemas de codificación.

Conclusión

Con este artículo he pretendido realizar una visión global de JWT y su uso en la autorización de usuarios. En el siguiente plantearé una implementación básica en un proyecto Java y en el tercer post trabajaremos en cómo conseguir mejorar esta implementación.

 

#transformaciondigital #innovacion #sectorseguros