Descodifica un JSON Web Token y consulta la cabecera y la carga útil.
Todos los cálculos se realizan localmente en tu navegador. No se envía ningún dato al servidor.
Los resultados tienen carácter informativo. Contrástalos con otras fuentes.
Leer un JSON Web Token
Un JWT son tres segmentos Base64url unidos por puntos: una cabecera que indica cómo se firmó, una carga con afirmaciones y una firma sobre los dos primeros. Descodificar muestra lo que el token afirma; no dice si es cierto.
Cómo funciona
- Divide el token por sus dos puntos en cabecera, carga y firma.
- Descodifica los dos primeros segmentos de Base64url a JSON y los formatea para leerlos.
- Muestra las afirmaciones temporales estándar —exp, iat, nbf— como fechas, ya que se guardan como segundos Unix.
- No toca la firma: verificarla exige el secreto o la clave pública del emisor, que nunca debe pegarse en una página web.
token = base64url(cabecera) . base64url(carga) . base64url(firma) firma = HMAC o RSA/ECDSA sobre los dos primeros segmentos exp/iat = segundos desde 1970-01-01T00:00:00Z (no milisegundos)
Ejemplo resuelto
La cabecera de casi cualquier token HS256 que exista, descodificada a mano.
- JSON de la cabecera: {"alg":"HS256","typ":"JWT"}
- codificar en Base64: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- fíjate en que el relleno = final se elimina: JWT siempre lo omite
- una carga de {"sub":"1234567890","iat":1516239022}
- 1516239022 segundos → 2018-01-18T01:30:22Z
El token descodificado dice que se firmó con HMAC-SHA256, que concierne al sujeto 1234567890 y que se emitió el 18 de enero de 2018. Si es auténtico es otra cuestión, y la responde la firma.
Cómo leer el resultado
- Descodificar no es verificar. Un token cuya carga diga admin: true no prueba nada hasta que la firma cuadre con una clave en la que confíes. Nunca tomes una decisión de autorización solo con la carga descodificada.
- No pegues tokens de producción en descodificadores en línea. Este se ejecuta por completo en tu navegador y no envía nada, pero eso no vale para todos los sitios, y un token bearer es una contraseña.
- La carga está codificada, no cifrada. Quien tenga el token lee todas sus afirmaciones: nunca metas un secreto ahí.
- Comprueba exp contra la hora actual y rechaza lo caducado. Comprueba también iss y aud: una firma válida del emisor equivocado sigue siendo el token equivocado.
- alg: none es un valor real y un ataque real. Un verificador que confíe en el algoritmo que indica la cabecera puede recibir la orden de no verificar nada.
Preguntas frecuentes
- ¿Puede esta herramienta decirme si mi token es válido?
- No, y ningún descodificador puede sin tu clave. Muestra lo que el token afirma. La validez exige que la firma cuadre, que el token no haya caducado y que emisor y audiencia sean los esperados: comprobaciones que corresponden a tu servidor, con una biblioteca.
- ¿Es seguro pegar aquí mi token?
- Esta página descodifica en tu navegador y no transmite nada. Aun así, la costumbre segura es usar tokens de un entorno de pruebas. Trata cualquier token con acceso real como una contraseña.
- ¿Por qué mi fecha exp sale en 1970?
- Casi con seguridad estás pasando milisegundos donde la especificación pide segundos. Date.now() en JavaScript devuelve milisegundos; divide entre 1000 antes de poner el valor en una afirmación.