Decodificador JWT

Pega un JWT (tres partes codificadas en base64url separadas por puntos) y el decodificador muestra el encabezado, la carga útil y la firma, decodificados y bien formateados, junto con el algoritmo detectado, la expiración del token en tu hora local, y si nbf (no antes), iat (emitido en) y exp (expiración) son consistentes. Verificación de firma opcional si tienes el secreto o la clave pública.

Cómo decodificar un JWT

  1. 1

    Pega el token

    Tres cadenas en base64url separadas por `.` (encabezado.carga útil.firma).

  2. 2

    Lee el encabezado decodificado

    Algoritmo, tipo, ID de clave (`kid`). El algoritmo te dice qué tipo de clave necesitas para la verificación.

  3. 3

    Lee la carga útil

    Claims estándar (`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`) más cualquier claim personalizado que emita tu aplicación.

  4. 4

    Verificar (opcional)

    Proporciona el secreto HMAC (para HS256/384/512) o la clave pública (para RS256, ES256, etc.) para confirmar que la firma es válida.

Anatomía de un JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjAwMDAwMDAwfQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Cada segmento está codificado en base64url (no en base64 estándar). El encabezado es JSON como {"alg":"HS256","typ":"JWT"}, la carga útil es JSON como {"sub":"1234567890","name":"Alice","iat":1600000000}, y la firma es la firma HMAC o RSA de encabezado.carga útil.

Claims estándar (RFC 7519)

Claim Nombre Notas
iss Emisor Quién emitió el token
sub Sujeto De quién es el token
aud Audiencia Para quién es el token
exp Tiempo de expiración Marca de tiempo Unix; rechazado después de este tiempo
nbf No antes Marca de tiempo Unix; rechazado antes de este tiempo
iat Emitido en Marca de tiempo de creación del token
jti ID de JWT Identificador único para listas de revocación

Algoritmos soportados

Valor alg Tipo de clave
HS256/HS384/HS512 Secreto HMAC compartido
RS256/RS384/RS512 Clave pública RSA
ES256/ES384 Clave pública ECDSA
PS256/PS384 Clave pública RSA-PSS
EdDSA / Ed25519 Curva de Edwards
none Nunca confíes en esto, tokens no firmados

La trampa de alg: none

Las primeras bibliotecas de JWT permitían tokens "alg": "none" y los aceptaban ingenuamente como válidos. Por eso, siempre:

  • Define una lista blanca de los algoritmos que tu aplicación acepta.
  • Rechaza alg: none incondicionalmente.
  • Rechaza alg: HS256 cuando tu código de verificación espera RS256 (el ataque de “confusión de algoritmo”).

Lo que NO es un JWT

  • No está encriptado. El encabezado y la carga útil están codificados en base64, lo cual es trivial de decodificar. Nunca pongas secretos en un JWT sin envolverlo en JWE.
  • No es revocable por defecto. Una vez emitido, un JWT es válido hasta exp. Para la revocación necesitas una lista negra o una expiración corta + tokens de actualización.
  • No es un reemplazo de cookie de sesión para cada caso de uso. Tokens opacos almacenados del lado del servidor son a menudo más simples y seguros.

Errores comunes

  • Confiar en el encabezado. El kid y alg provienen del token mismo. Un servidor comprometido puede establecerlos arbitrariamente; siempre valida contra una lista fija.
  • Ignorar la desviación de nbf y iat. La deriva del reloj significa que iat > ahora puede suceder. Permite un pequeño margen (30-60s).
  • Registrar JWTs completos. La carga útil a menudo contiene IDs de usuario, correos electrónicos, permisos, PII que no debería terminar en stdout.
  • Usar HS256 con un secreto débil. Un secreto de 16 caracteres es susceptible a fuerza bruta en minutos. Usa al menos 256 bits de entropía aleatoria.

Preguntas frecuentes

No. La decodificación se realiza en tu navegador. El token permanece local, importante porque los JWT a menudo contienen datos de sesión, IDs de usuario y permisos.

Sí. Si pegas el secreto HMAC compartido o la clave pública codificada en PEM, la verificación ocurre en tu navegador. La clave nunca sale de tu máquina.

Significa que el token no está firmado. Nunca aceptes tales tokens en producción, pueden ser falsificados trivialmente. Varios CVEs de alto perfil fueron específicamente sobre bibliotecas que aceptaban alg: none por defecto.

La firma de JWT prueba autenticidad, no confidencialidad. El encabezado y el payload están codificados en base64url, lo cual es reversible. Para la confidencialidad, usa JWE (JSON Web Encryption) alrededor del JWT, o evita poner datos sensibles en el payload.

Herramientas relacionadas

Herramienta disponible en otros idiomas