¿Qué es un JWT?

Un JWT (JSON Web Token, estándar RFC 7519) es un token que una aplicación entrega al usuario cuando inicia sesión, y que este envía en cada petición para demostrar quién es, normalmente en la cabecera Authorization: Bearer …. Tiene tres partes separadas por puntos:

  • Cabecera: el tipo de token y el algoritmo de la firma, por ejemplo {"alg": "HS256", "typ": "JWT"}.
  • Contenido (payload): los datos, llamados claims o reclamaciones: quién es el usuario, cuándo caduca el token, sus permisos…
  • Firma: garantiza que nadie ha cambiado las dos partes anteriores.

Las dos primeras partes son JSON codificado en Base64url, por eso se pueden leer sin ninguna clave.

Reclamaciones registradas

  • iss: quién emitió el token.
  • sub: a quién se refiere, normalmente el identificador del usuario.
  • aud: para quién es el token.
  • exp, nbf e iat: cuándo caduca, desde cuándo es válido y cuándo se emitió. Son segundos desde el 1 de enero de 1970 (puedes convertirlos con el conversor de timestamp).
  • jti: un identificador único del token.

Un JWT no es secreto

La firma impide que alguien modifique el token, pero no oculta su contenido: cualquiera que lo tenga puede leerlo, como acabas de hacer. Por eso nunca hay que guardar en un JWT contraseñas ni datos privados, y hay que tratar el token como una contraseña mientras sea válido.

HS256, RS256, ES256…

Los algoritmos HS (HMAC) firman y comprueban con la misma clave secreta, que deben compartir quien emite el token y quien lo verifica. Los RS (RSA) y ES (curvas elípticas) usan una clave privada para firmar y una pública para comprobar, así que cualquiera puede verificar el token sin poder fabricar otros. Un token con "alg": "none" no lleva firma y nunca debería aceptarse.

Copiado al portapapeles.