Decodificador JWT

Decodifica un JSON Web Token para leer su header y sus claims, sin necesidad del secreto.

JWT decode online: decodifica el header, el payload y la expiración de un JSON Web Token

Pega un token JWT en el cuadro de arriba y el decodificador lo separa por los puntos, decodifica el header y el payload desde Base64url y los muestra como JSON con sangría. Debajo del payload aparecen las claims de tiempo `exp`, `nbf` e `iat` convertidas a fechas UTC legibles, con el estado del token: `(EXPIRED)` si ya caducó, `(not expired)` si sigue vigente y `(not yet valid)` si `nbf` todavía está en el futuro. Todo ocurre en tu navegador: el token no se envía a ningún servidor, algo importante porque un JWT suele ser una credencial activa.

Qué es un token JWT y qué verás al decodificarlo

Un JSON Web Token (RFC 7519) es un texto con tres partes separadas por puntos: header, payload y firma. Las dos primeras son JSON codificado en Base64url, no cifrado; la tercera son los bytes de la firma. Por eso casi todos los tokens empiezan por eyJ: es lo que produce Base64 al codificar {" seguido de una letra.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiJ1c3JfNDgyMSIsIm5hbWUiOiJNYXLDrWEgTMOzcGV6Iiwicm9sIjoiZWRpdG9yIiwiaWF0IjoxNzkwMDAwMDAwLCJleHAiOjE3OTAwMDM2MDB9
.GmGkI9ANxLJmFhpo2eqFfcMCNfpaRWtu7COhVmqWUfc

Header   { "alg": "HS256", "typ": "JWT" }
Payload  { "sub": "usr_4821", "name": "María López", "rol": "editor",
           "iat": 1790000000, "exp": 1790003600 }

exp: 2026-09-21T15:13:20.000Z (EXPIRED)
iat: 2026-09-21T14:13:20.000Z

El header indica el algoritmo de firma (alg, por ejemplo HS256 o RS256) y a veces un kid, el identificador de la clave pública con la que el servidor debe comprobar la firma. El payload contiene las claims: quién emitió el token, a quién se refiere, para qué API es válido, cuándo caduca y los datos propios de la aplicación, como roles o permisos. El decodificador interpreta el payload como UTF-8, así que nombres con tildes o eñes se leen bien.

Las claims registradas

RFC 7519 define siete nombres de claim registrados. Ninguno es obligatorio, pero los proveedores de identidad suelen usarlos todos:

iss   emisor           quién creó y firmó el token (tu proveedor de identidad)
sub   sujeto           el usuario o cliente al que se refiere
aud   audiencia        la API o aplicación a la que va dirigido
exp   expiración       momento a partir del cual el token debe rechazarse
nbf   no antes de      momento anterior al cual el token debe rechazarse
iat   emitido en       momento en que se creó
jti   ID del token     identificador único, útil para detectar reutilización

Los tiempos son NumericDate: segundos desde 1970, no milisegundos. Si una fecha convertida cae en enero de 1970 o miles de años en el futuro, quien generó el token usó la unidad equivocada. Los ID tokens de OpenID Connect añaden claims como email, name o nonce, y proveedores como Auth0, Keycloak o Azure AD suman las suyas.

Token JWT expirado: cómo interpretarlo

La causa más habitual de un 401 con JWT es que el token caducó. El decodificador compara exp con el reloj de tu equipo y marca (EXPIRED) cuando ya pasó. Los access tokens suelen durar de minutos a una hora, así que un token copiado de los logs de ayer casi seguro estará expirado.

Si el token no ha caducado según esta página y aun así el servidor lo rechaza, revisa nbf y la hora de los servidores: una diferencia de reloj de unos minutos basta para que un token recién emitido parezca del futuro. Muchas librerías admiten un margen de tolerancia (leeway o clockTolerance) para ese caso. Revisa también aud e iss, que el servidor compara con su configuración.

Decodificar no es verificar

Cualquiera puede decodificar un JWT sin la clave, porque el contenido solo está codificado. Por eso un payload decodificado no demuestra nada: un atacante puede cambiar "rol": "editor" por "rol": "admin", volver a codificarlo y el token se seguirá decodificando perfectamente. Solo la verificación de la firma detecta el cambio.

Usa el decodificador para depurar. Antes de confiar en una claim dentro de tu aplicación, verifica la firma con el secreto o la clave pública y comprueba exp, nbf, iss y aud con una librería mantenida: jsonwebtoken o jose en Node.js, PyJWT en Python, firebase/php-jwt en PHP o JJWT en Java. Para comprobar una firma a mano, pega el token y la clave en el validador de JWT del sitio.

Decodificar un JWT en JavaScript, Python y PHP

Leer el payload en código es útil para registrar datos o para renovar el token en el cliente antes de que expire:

// JavaScript (navegador o Node.js 16+)
const payload = JSON.parse(new TextDecoder().decode(Uint8Array.from(
  atob(token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0))));

# Python, PyJWT: leer sin verificar (solo para depurar)
jwt.decode(token, options={"verify_signature": False})

// PHP
$payload = json_decode(base64_decode(strtr(explode('.', $token)[1], '-_', '+/')), true);

El paso con TextDecoder no es decorativo: atob devuelve bytes sueltos, y sin él López aparece como López. En cualquier lenguaje, la regla es la misma: esto sirve para leer, nunca para autorizar.

Cuando el token no se puede decodificar

Si pegas algo con menos de dos partes, el decodificador avisa de que un JWT necesita al menos header y payload; normalmente el token se cortó al copiarlo. Si el header de autorización trae el prefijo Bearer , quítalo: no forma parte del token. Un token con cinco partes es un JWE, un JWT cifrado cuyo contenido no se puede leer sin la clave de descifrado.

Si el resultado es un error de JSON, puede que no sea un JWT: algunos proveedores emiten access tokens opacos, cadenas aleatorias que solo el servidor emisor sabe interpretar.

Privacidad del token

Un token válido permite actuar en nombre del usuario hasta que caduca. No pegues tokens de producción en herramientas que los envían a un servidor, ni en tickets o chats. Esta página los decodifica localmente y no los guarda. Recuerda también que el payload lo puede leer cualquiera que tenga el token, así que no pongas contraseñas ni datos sensibles en las claims.

Frequently asked questions

¿Cómo decodificar un JWT online?

Pega el token completo en el cuadro del decodificador. El header y el payload aparecen como JSON, y las claims exp, iat y nbf se muestran como fechas UTC con el estado del token.

¿Se puede decodificar un JWT sin la clave secreta?

Sí. El header y el payload están en Base64url, no cifrados, así que se leen sin ninguna clave. La clave solo hace falta para verificar la firma.

¿Decodificar un JWT sirve para validarlo?

No. Decodificar solo muestra el contenido, y un token manipulado se decodifica igual de bien. Verifica la firma y las claims exp, iss y aud antes de confiar en él.

¿Cómo sé si un token JWT está expirado?

Mira la claim exp, un tiempo Unix en segundos. El decodificador la convierte en fecha y añade EXPIRED si ya pasó según el reloj de tu equipo.

¿Qué es JWT y para qué sirve?

JSON Web Token es un formato estándar para transmitir claims firmadas entre dos partes. Se usa sobre todo como access token o ID token en APIs, OAuth 2.0 y OpenID Connect.

¿Es seguro pegar mi token aquí?

Sí: la decodificación ocurre en esta pestaña y el token no viaja a ningún servidor. El riesgo suele estar en otra parte: un token vigente pegado en un ticket, un chat o una captura de pantalla permite actuar como ese usuario hasta que caduque.