Decodificador de JWT

Pega un JSON Web Token para ver su encabezado, su payload y su caducidad. La decodificación se hace localmente; tu token nunca se envía a ningún sitio.

Funciona 100% en tu navegador. Nada de lo que pegas se sube ni se guarda.

Encabezado

Payload

Claims

La firma se muestra, pero no se verifica: para verificarla hace falta la clave secreta o pública, que nunca deberías pegar en una web.

Cómo usar el decodificador de JWT

  1. Pega un JSON Web Token, la cadena larga que suele ir detrás de Authorization: Bearer.
  2. El encabezado y el payload se decodifican y se muestran como JSON formateado.
  3. Los claims de tiempo, como exp, iat y nbf, se convierten en fechas legibles, para que veas de un vistazo si el token ha caducado.
Privacidad: Nunca pegues tokens de producción en un sitio en el que no confíes; cualquiera que vea un token válido puede reutilizarlo hasta que caduque. Este decodificador se ejecuta por completo en tu navegador: el token nunca se sube, se registra ni se guarda. Aun así, usa preferiblemente tokens de prueba y revoca cualquier token que sospeches que ha quedado expuesto.

Anatomía de un JWT

Un JSON Web Token, definido en el RFC 7519, es una forma compacta de transmitir claims (afirmaciones) entre partes. La forma firmada habitual (JWS) tiene tres partes separadas por puntos:

header.payload.signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.<signature>
  • Encabezado (header): JSON que describe el token, sobre todo el algoritmo de firma. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 se decodifica como {"alg":"HS256","typ":"JWT"}.
  • Payload: JSON que contiene los claims, es decir, las afirmaciones sobre el usuario o la sesión.
  • Firma (signature): se calcula sobre el encabezado y el payload codificados con un secreto (HMAC, p. ej. HS256) o una clave privada (p. ej. RS256, ES256).

Cada parte se codifica en base64url, el alfabeto Base64 seguro para URL y sin relleno. Por eso los tokens contienen - y _, y por eso los JWT casi siempre empiezan por eyJ: así se codifica el {" inicial de un objeto JSON cuando le sigue un nombre de clave típico en minúsculas. Puedes explorar la propia codificación con el codificador Base64.

Claims registrados

ClaimNombreSignificado
issEmisor (issuer)Quién creó y firmó el token.
subSujeto (subject)A quién se refiere el token, normalmente un ID de usuario.
audAudiencia (audience)A qué servicio o servicios va destinado el token.
expCaducidad (expiration time)Marca de tiempo Unix a partir de la cual el token debe rechazarse.
nbfNo antes de (not before)Marca de tiempo Unix antes de la cual el token aún no es válido.
iatEmitido en (issued at)Marca de tiempo Unix del momento en que se creó el token.
jtiID del JWTIdentificador único, útil para evitar la reutilización.

En el RFC 7519 todos son opcionales; cada aplicación decide cuáles exige. Los claims de tiempo van en segundos, no en milisegundos; el conversor de timestamp Unix explica la diferencia.

Errores habituales

Decodificar no es verificar

Cualquiera puede decodificar un JWT; es justo lo que hace esta herramienta. Decodificar te dice lo que un token afirma, no si esas afirmaciones son auténticas. Un servidor debe verificar la firma con la clave correcta y comprobar exp, nbf, iss y aud antes de fiarse de nada del payload.

El payload no es secreto

Cualquiera que tenga un JWT firmado puede leerlo. No pongas en el payload contraseñas, datos personales que no expondrías al cliente ni secretos internos. Si el contenido debe ser confidencial, usa un JWT cifrado (JWE) o guarda los datos en el servidor.

alg: none y confusión de algoritmos

Las especificaciones JOSE definen un valor "alg": "none" para tokens sin protección con la firma vacía. Una biblioteca que haga caso al propio encabezado del token podría aceptar un token falsificado como este:

{"alg": "none", "typ": "JWT"}
{"sub": "admin"}
(firma vacía)

Un ataque relacionado cambia un token RS256 a HS256 para que la clave pública se use indebidamente como secreto HMAC. La defensa es la misma en ambos casos: configura en el servidor los algoritmos permitidos y no dejes nunca que el token los elija.

Consejos

  • Haz que los tokens de acceso duren poco y usa tokens de actualización (refresh tokens) para sesiones más largas.
  • Permite un pequeño desfase de reloj (por ejemplo, un minuto) al comprobar exp y nbf entre servidores.
  • Usa una biblioteca de JWT bien mantenida en lugar de analizar y verificar los tokens a mano.

Preguntas frecuentes

¿Puede esta herramienta verificar la firma de un JWT?

La verificación requiere el secreto o la clave pública del emisor y debe hacerse en tu backend. Esta herramienta sirve para inspeccionar el encabezado y los claims de un token mientras depuras.

¿Por qué mi token aparece como caducado?

El claim exp es anterior a la hora actual de tu dispositivo. Comprueba que tu reloj esté bien y que el emisor haya escrito exp en segundos.

¿Los JWT están cifrados?

Los JWT firmados (JWS), que son la inmensa mayoría de los que se usan, solo están codificados y firmados, así que cualquiera puede leerlos. Los JWT cifrados (JWE) tienen cinco partes en lugar de tres.

¿Es seguro pegar mi token aquí?

La decodificación se hace en local y no se transmite nada. Como norma general, evita pegar tokens de producción activos en cualquier herramienta online que no hayas revisado.

Actualizado

Copiado al portapapeles