Skip to content

Entendiendo JWT

Posted on:July 14, 2019 at 09:28 PM

Table of Contents

Open Table of Contents

¿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:

¿Cuál es la estructura de un JWT?

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

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.

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 😂.