Decodificador de JWT (JSON Web Token)
Pega un JSON Web Token para ver su cabecera y su contenido en JSON legible, con las fechas de emisión y caducidad traducidas a tu hora local. Si conoces el secreto, comprueba también la firma HS256.
Cómo usar el decodificador
- Pega el token completo; puede incluir el prefijo
Bearerque se copia de la cabeceraAuthorization, la herramienta lo quita. - Verás el header (algoritmo y tipo) y el payload (las claims) con formato. Las fechas
exp,iatynbfaparecen en tu hora local y se indica si el token ha caducado o aún no es válido. - Si el algoritmo es HS256, HS384 o HS512 y escribes el secreto, se verifica la firma con la Web Crypto API.
El ejemplo cargado está firmado con el secreto mi-clave-secreta; cambia una letra del secreto o del token y verás cómo la verificación falla. Nada de lo que pegas sale de tu navegador.
Estructura de un JWT
Un JWT (RFC 7519) son tres partes en Base64URL separadas por puntos:
base64url(header) . base64url(payload) . base64url(firma)
- Header: JSON con el algoritmo (
alg) y el tipo (typ), a veces el identificador de clave (kid). - Payload: JSON con las claims, es decir, los datos del usuario y de la sesión.
- Firma: en HS256,
HMAC-SHA256(secreto, header + "." + payload). Puedes reproducir ese cálculo con el generador de hash en modo HMAC.
Base64URL es la variante de Base64 que usa - y _ en lugar de + y / y omite el relleno =, para poder ir en URL y cabeceras sin codificar.
Claims registradas más comunes
| Claim | Nombre | Significado |
|---|---|---|
| iss | Issuer | Quién emitió el token (URL del servidor de identidad) |
| sub | Subject | A quién se refiere, normalmente el ID del usuario |
| aud | Audience | Para qué API o aplicación es válido |
| exp | Expiration | Momento a partir del cual se debe rechazar (segundos Unix) |
| nbf | Not before | Momento antes del cual no es válido |
| iat | Issued at | Momento de emisión |
| jti | JWT ID | Identificador único, útil para listas de revocación |
En el ejemplo, iat = 1767225600 es el 1 de enero de 2026 a las 00:00 UTC y exp = 1767229200 es una hora después: un token de acceso de 60 minutos. Para convertir otros valores usa el conversor de timestamp Unix.
Errores de seguridad frecuentes
- Confiar en un token decodificado sin verificar: el servidor debe comprobar siempre firma,
exp,issyaud. Esta herramienta sirve para depurar, no para autorizar. - Aceptar
"alg": "none": algunas librerías antiguas lo admitían y permitían tokens sin firma. Fija en el servidor la lista de algoritmos permitidos. - Secretos HS256 débiles: un secreto corto se puede adivinar por fuerza bruta a partir de un solo token. Usa al menos 32 bytes aleatorios.
- Guardar datos sensibles en el payload: cualquiera puede leerlo. Si necesitas confidencialidad, usa JWE (tokens cifrados), que esta herramienta no descifra.
- Tokens sin caducidad: sin
exp, un token robado sirve para siempre.
Si el payload tiene estructuras grandes, cópialo y ábrelo en el formateador de JSON para explorarlo con más comodidad.
Preguntas frecuentes
¿Un JWT está cifrado?
No, un JWT firmado (JWS) solo está codificado en Base64URL: cualquiera que lo tenga puede leer su contenido. La firma impide modificarlo, no leerlo. Por eso nunca debe incluir contraseñas ni datos sensibles.
¿Es seguro pegar mi token en esta página?
La decodificación y la verificación se hacen en tu navegador y el token no se envía a ningún servidor. Aun así, trata los tokens de producción como contraseñas: si caducan pronto, mejor.
¿Por qué dice «firma no verificada»?
Decodificar no requiere la clave, pero comprobar la firma sí. Para HS256 escribe el secreto compartido; para RS256 o ES256 hace falta la clave pública del emisor y la verificación debe hacerla tu servidor con una librería JWT.
¿En qué unidad están exp e iat?
En segundos desde el 1 de enero de 1970 UTC (tiempo Unix), no en milisegundos. Un error típico es comparar exp con Date.now() de JavaScript sin dividir entre 1000.