Decodificador JWT
Decodifica JWT (JSON Web Token) en el navegador y visualiza header, payload y firma.iat / exp / nbf se convierten automáticamente a fechas legibles.
Header
Payload
Signature
* La verificación de firma requiere clave secreta o pública; esta herramienta solo decodifica.
Sobre la estructura del JWT
Un JWT es una cadena formada por header.payload.signature tres partes unidas con puntos (.). Header y payload son JSON codificados en Base64URL, y la firma se genera con el algoritmo indicado en el header (HS256 / RS256, etc.).
Claims principales: iss (emisor), sub (sujeto), aud (audiencia), exp (expiración), nbf (no antes de), iat (emitido en), jti (ID del JWT)
📖 Dónde se suele tropezar
Descompone un JWT en su cabecera, carga útil y firma, y convierte las reclamaciones temporales como exp o iat en fechas legibles. Todo se ejecuta en el navegador y la firma no se verifica, porque eso requiere una clave. Lo que hay que retener es que poder descodificarlo significa que cualquiera puede leer su contenido: la carga útil de un JWT no está cifrada, sólo codificada en Base64URL.
| Caso | Qué ocurre | Qué hacer |
|---|---|---|
| Meter secretos en la carga útil | Base64URL es una codificación, no un cifrado: como demuestra esta página, cualquiera sin clave puede leer el contenido. Aun así, la creencia de que la firma lo hace seguro es tenaz, y se ven diseños que meten en la carga útil datos personales, la estructura interna de permisos, identificadores de la empresa y, a veces, una dirección de correo y una fecha de nacimiento. Un JWT vive en localStorage o en una cookie, aparece en los registros y a veces viaja en una URL: lo preciso es tratar su contenido como información pública. |
Mete sólo un identificador en la carga útil y consulta el resto en el servidor: un identificador de usuario y un nombre de rol, no un nombre, un correo o una dirección. Si necesitas cifrado, JWE (JSON Web Encryption) es una especificación aparte para eso, pero pregúntate antes si hace falta que esté en el JWT: casi siempre lo que necesitas es quién es esta persona, y qué es puede quedarse en el servidor. La prueba es simple: te importaría que ese valor apareciera en texto plano en un registro de acceso? Si no, puede ir; si sí, no puede. |
| Fiarse del contenido tras sólo descodificarlo | Sin verificar la firma, un JWT es sólo una cadena que el usuario puede reescribir a voluntad. El código que lo descodifica, lee role: "admin" y lo usa para autorizar acepta un token en el que el atacante escribió ese valor. Dos fallos son históricamente célebres. Uno es el ataque alg: "none": reescribe el algoritmo de la cabecera a none, deja la firma vacía y algunas implementaciones lo aceptaban sin rechistar. El otro es confundir HS256 con RS256: lograr que el verificador use la clave pública como secreto HMAC permite falsificar una firma válida sólo con información pública. |
Verifica siempre con la función de verificación de la biblioteca y fija explícitamente los algoritmos permitidos: jwt.verify(token, key, { algorithms: ["RS256"] }). Si omites ese argumento, algunas implementaciones confían en el alg de la cabecera, lo que equivale a dejar que un valor controlado por el atacante decida cómo se verifica. Nunca uses una función que sólo descodifica —cualquiera llamada como jwt.decode— para una decisión de autorización: los nombres se confunden con facilidad, pero esa no verifica nada y existe sólo para depurar. Antes de escribir el código, comprueba qué función de tu biblioteca verifica y cuál se limita a descodificar. |
| El token sigue funcionando tras cerrar sesión | Ser sin estado es la ventaja de diseño de un JWT y a la vez su mayor limitación. El servidor no guarda el token, así que no hay forma de invalidar uno concreto después de emitirlo. Cerrar sesión significa en realidad descartar el token en el cliente, y quien lo haya copiado puede seguir usándolo hasta que caduque. Por lo mismo, revocar un permiso deja el permiso antiguo escrito en los tokens ya emitidos. Por eso el acceso de alguien que se ha marchado puede sobrevivir una hora después de creer que lo habías cortado. | Usa una caducidad corta junto con un token de refresco: un token de acceso de unos quince minutos, renovado con un token de refresco que el servidor sí controla. Con ese montaje, revocar el token de refresco corta el acceso en quince minutos como mucho. Si la revocación inmediata es un requisito, necesitas una lista de bloqueo: guardar los identificadores de los tokens revocados y cotejarlos al verificar, pero eso implica mantener estado, lo que renuncia a parte del motivo para usar un JWT. Ahí está la bifurcación: si de verdad necesitas revocación inmediata, un identificador de sesión con sesión en el servidor es más simple y fiable. Los JWT encajan en autenticación que abarca varios servicios, o cuando quieres distribuir la propia verificación. |
Las reclamaciones temporales van en segundos. exp, iat y nbf son segundos Unix, y meter milisegundos da una caducidad a cincuenta mil años vista: un token efectivamente permanente. Como Date.now() de JavaScript devuelve milisegundos, escribir Date.now() + 3600000 y volcarlo en exp es un error muy frecuente; la forma correcta es Math.floor(Date.now() / 1000) + 3600. Si la fecha descodificada cae muy lejos en el futuro, sospecha exactamente de eso: mostrar las reclamaciones como fechas legibles es justo lo que permite cazarlo a ojo. Segundo, concede un margen de unas decenas de segundos al validar nbf y exp, para absorber el desfase de reloj entre servidores; las bibliotecas principales tienen esa opción. Por último, un aviso operativo: no pegues un token de producción vigente en un descodificador de JWT en línea: es una credencial, y si acaba en los registros del servidor donde lo pegaste, otra persona puede suplantarte con él. Esta página se ejecuta por completo en tu navegador, pero haz el hábito de confirmarlo en la pestaña de red de tus herramientas de desarrollo.
📖 Cómo usar
-
1
Copia tu JWTObtén el JWT desde la respuesta API o cabecera Authorization.
-
2
Pega en el campoPega el JWT en el textarea superior y la decodificación es automática.
-
3
Inspecciona header y payloadVe el algoritmo (alg), emisor (iss), expiración (exp) y otras claims.
❓ Preguntas frecuentes
¿Qué es un JWT?
¿Verifica la firma?
¿Se envía el JWT al servidor?
¿Qué hago si exp está caducado?
🐛 ¿Encontró un problema con esta herramienta?
Gratis, sin registro. Incluso solo los pasos para reproducir ayudan. Los informes van directamente al operador y se usan para corregir.
¡Gracias por tu reporte!
Tu reporte llegó al operador y se usará para mejorar.