Decodificador JWT

Decodifica header y payload JWT. No verifica la firma.

El formulario interactivo está listo al activar JavaScript.

Cómo utilizar

Un JSON Web Token (JWT, RFC 7519) suele constar de tres partes separadas por puntos: una cabecera, un payload y una firma. Las dos primeras son JSON codificado en Base64URL, una variante de Base64 segura para URL que, en los JWT, se escribe sin el relleno =. Pega un token y «Decodificar» muestra la cabecera y el payload como JSON con sangría. La firma no se decodifica: son datos binarios, no JSON.

La cabecera indica el algoritmo (alg): HS256 usa un secreto compartido (un HMAC), mientras que RS256 y ES256 son firmas hechas con una clave privada y comprobadas con la clave pública correspondiente. El payload contiene los claims: entre los claims estándar figuran iss (emisor), sub (sujeto), aud (audiencia), exp (caducidad), nbf (no antes de), iat (fecha de emisión) y jti (ID del token).

exp, nbf e iat son timestamps Unix en segundos. Esta herramienta los muestra como números; para leer uno como fecha, pégalo en el «Conversor Unix timestamp».

Decodificar no es verificar. Cualquiera puede crear un token con cualquier payload, así que un token decodificado no demuestra nada hasta que la aplicación que lo recibe comprueba la firma con la clave correcta, acepta solo los algoritmos que espera y comprueba exp y nbf. Un token con alg igual a none no tiene ninguna firma y debe rechazarse, salvo que eso se haya previsto expresamente.

Base64URL es una codificación, no un cifrado: cualquiera que tenga un token puede leer su payload, y por eso las contraseñas y otros secretos no deben ir en él. Los tokens cifrados (JWE) tienen cinco partes y no se pueden leer sin la clave, así que esta herramienta los rechaza. La decodificación se hace en tu navegador; el token no se envía a ningún sitio.

Ejemplo

Decodifica un token de demostración. Leer su cabecera y contenido no verifica una firma ni demuestra autenticidad.

  • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.signatureCabecera {"alg": "HS256", "typ": "JWT"} y payload {"sub": "123"}.
  • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiQW5hIiwiaWF0IjoxNzA0MDY3MjAwLCJleHAiOjE3MDQwNzA4MDB9.signaturePayload con iat 1704067200 y exp 1704070800: emitido a medianoche UTC del 1 de enero de 2024 y válido durante una hora.
  • eyJhbGciOiJub25lIn0.eyJzdWIiOiIxMjMifQ.Cabecera {"alg": "none"} y una firma vacía: un token sin firmar, que normalmente un servidor debería rechazar.

Preguntas frecuentes

¿Es seguro pegar un token de producción?

El proceso es local, pero los tokens pueden contener datos sensibles. Usa preferiblemente un token censurado o caducado y nunca compartas un secreto de firma.

¿Puede esta herramienta decirme si un token es válido?

No. No comprueba la firma, la caducidad ni el emisor. Para verificar un token hace falta el secreto compartido (HS256) o la clave pública del emisor (RS256, ES256), y esa tarea corresponde a la aplicación que lo acepta.

¿Por qué se puede leer el payload si el token está firmado?

Una firma protege contra los cambios, no contra la lectura. El payload solo está codificado en Base64URL, así que es público para cualquiera que vea el token.

¿Por qué me aparece un error?

El texto no es un token cuyas dos primeras partes se decodifiquen como JSON. Comprueba que se ha copiado el token completo, sin la palabra Bearer ni comillas alrededor, y que no es un JWE cifrado.

Herramientas relacionadas