Entendiendo JWT

14 julio, 2019

Qué es JSON Web Token

¿Qué es JSON Web Token?

JSON Web Token (JWT) es un estándar abierto que define una manera compacta y autónoma para transmitir de forma segura información entre las partes (cliente-servidor por ejemplo), como un objeto JSON.

Esta información puede ser verificada y confiable debido a que esta digitalmente firmada. JWTs se pueden firmar usando un secreto (con el algoritmo HMAC) o un par de llaves públicas/privadas usando RSA o ECDSA.

¿Cuando deberías usar JWT?

Tenemos dos escenarios principales donde JWTs son útiles:

  • Autorización: Este es el escenario más común para usar JWT. Una ves que el usuario ha iniciado sesión, cada petición subsecuente incluirá el JWT, permitiendo al usuario acceder a rutas, servicios, y recursos que están permitidos con ese token.

  • Intercambio de información: JWTs son una buena forma de transmitir información de forma segura entre las partes. Debido a que JWTs pueden ser firmados, ya sea usando un par de llaves públicas/privadas, podemos estar seguros que los remitentes son quienes dicen ser. Adicionalmente, como la firma es calculada usando el header y el payload, también podemos verificar que el contenido no haya sido manipulado.

¿Cuál es la estructura de un JWT?

Un JWT está formado de tres partes separadas por puntos, las cuales son:

  • Header
  • Payload
  • Signature

Header

El header típicamente consta de dos partes: el tipo de token, el cuál es JWT, y el algoritmo de hash que se utiliza, como HMAC, SHA256 o RSA.

Por ejemplo:

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

La segunda parte del token es el payload, el cuál contiene los claims. Los Claims son declaraciones sobre una entidad (generalmente información relacionada al usuario) y datos adicionales. Hay tres tipos de claims, registrados, públicos y privados.

  • Registrados: Son un conjunto de claims predefinidos los cuáles no son obligatorios, pero si son recomendados. Algunos de ellos son: iss (issuer), sub (subject), aud (audience), entre otros.

  • Públicos: Estos pueden ser definidos a voluntad por aquellos que usan JWT. Pero para evitar colisiones, deben definirse en el registro de tokens web IANA JSON o definirse como una URI que contenga un espacio de nombres resistentes a colisiones.

  • Privados: Son los claims personalizados creados para compartir información entre partes que concuerdan en usarlos y pueden ser claims registrados o públicos.

Un ejemplo de payload podría ser:

{
  "id": 1,
  "admin": true,
  "name": "Gustavo Castillo",
  "sub": "1234567890"
}

Signature

Para crear la parte de la signature (firma) tenemos que tomar el header codificado, el payload codificado, un secret, el algoritmo especificado en el header y firmarlo. Por ejemplo si quieres usar el algoritmo HMAC SHA256, la signature será creada de la siguiente forma:

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

La signature es usada para verificar que el mensaje no se modificó en el camino y, en el caso de los tokens firmados con una llave privada, también puede verificar que el remitente del JWT es quién dice ser.

Conclusión

Los JWT son por mucho el mecanismo de autenticación preferido por los programadores para verificar las partes cliente-servidor, y son ampliamente utilizados en aplicaciones tipo SPA (single page applications) desarrolladas con React, VueJS, Angular o por el framework JavaScript que haya salido está mañana 😂.


Gustavo Castillo | Desarrollador Web | Aprende Enseñando y Compartiendo.