Viendo en Español Ver en inglés

Decodificador JWT

Decodifica e inspecciona un JSON Web Token. La verificación de la firma requiere la clave de firma y debe hacerse en el servidor — esta herramienta solo muestra el contenido.

  1. Copia el JWT desde tu app, respuesta de API o cabecera Authorization.
  2. Pégalo en el cuadro. La decodificación se ejecuta automáticamente mientras escribes.
  3. Lee la cabecera y el payload decodificados; la firma se muestra tal cual como referencia.
  4. Revisa el resumen de claims temporales (iat, exp, nbf) para detectar tokens caducados.
¿Qué hace?

Un JSON Web Token son tres segmentos codificados en base64url unidos por puntos: header.payload.signature. La cabecera y el payload son JSON; la firma es la salida de HMAC o RSA/ECDSA sobre los dos primeros segmentos. Esta herramienta divide por los puntos, decodifica cada parte en base64url, parsea el JSON y muestra claims temporales estándar como exp en fechas legibles. No verifica la firma — mira las FAQ para entender por qué.

Ejemplo

Token de ejemplo de la especificación JWT (firmado con HS256 y el secreto your-256-bit-secret):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Cabecera decodificada:

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload decodificado:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

¿Por qué mi firma JWT se marca como inválida?

Este decodificador no comprueba firmas (ver FAQ), pero si un verificador del servidor rechaza tu token, estas son las causas habituales.

  • Secreto o clave incorrectos. Un solo carácter distinto en el secreto HMAC produce una firma completamente diferente. Comprueba que la variable JWT_SECRET del servicio de validación coincide con la del emisor.
  • Algoritmo que no coincide. Un token firmado con HS256 no puede verificarse con RS256. Comprueba el claim alg en la cabecera y asegúrate de que el verificador está configurado con el mismo algoritmo.
  • Token caducado. Un JWT firmado correctamente también falla la validación si exp ya es pasado. El resumen de claims temporales lo muestra explícitamente tras decodificar.
  • Desfase de reloj. Un nbf (not-before) ligeramente futuro sumado a una desincronización del reloj del servidor provoca errores de "token aún no válido". Permite un pequeño margen (p. ej., 60 segundos) en tu verificador.
  • Espacios al pegar el token. Al copiar y pegar a veces se cuela un espacio inicial o un salto de línea final. Un JWT debe ser exactamente header.payload.signature sin espacios alrededor.
  • alg: none. Si la cabecera indica "alg": "none", el token no está firmado. Rechaza este tipo de tokens en el verificador — nunca los trates como válidos.
Preguntas frecuentes

¿Esta herramienta verifica la firma del JWT?

No, y es intencional. Verificar una firma requiere la clave de firma — un secreto compartido HMAC o una clave pública asimétrica. Esa clave pertenece al servidor que emite o consume el token, no debe pegarse en una página web. Esta herramienta solo decodifica y muestra; la verificación se hace en tu backend.

¿Qué contiene cada uno de los tres segmentos del JWT?

Un JWT es header.payload.signature. La cabecera es un JSON que describe el algoritmo (alg) y el tipo de token. El payload es un JSON con claims como sub, iat, exp. La firma es la salida, codificada en base64url, de firmar los dos primeros segmentos con el secreto o la clave privada. Los dos primeros solo están codificados, no cifrados.

Mi JWT ha caducado — ¿cómo lo sé?

Mira el claim exp en el payload. Es un timestamp Unix en segundos. Si Date.now() / 1000 es mayor que exp, el token ha caducado. Esta herramienta muestra exp, iat y nbf como fechas legibles bajo el payload para que se vea de un vistazo sin hacer el cálculo a mano.

¿Qué significa alg: none y por qué es peligroso?

alg: none es una característica de JWT en la que la firma está vacía y no se comprueba. Muchas librerías han aceptado históricamente tales tokens, permitiendo a atacantes falsificar JWT creando un payload y estableciendo alg en none. Si ves este valor en la cabecera, el token no está firmado — no confíes en ningún servidor que lo acepte.

¿Guardan los JWT que pego aquí?

No. No guardamos ningún token que pegues en el decodificador. Lo que introduzcas se descarta al cerrar o actualizar la pestaña — no hay registros ni rastro por nuestra parte de los tokens que revisaste. Aun así, un JWT otorga acceso hasta su exp: trátalo como una contraseña y rota cualquier token de producción que depures.

La sección de firma muestra un bloque ilegible — ¿es normal?

Sí. La firma es la salida binaria de HMAC o RSA/ECDSA, codificada en base64url. No está pensada para ser legible — solo sirve como comprobación criptográfica. Lo que usas son la cabecera y el payload decodificados. Una firma vacía significa que el token no está firmado (alg: none).