Saltar al contenido

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.

100% Gratis Sin registro Solo navegador 5 idiomas Modo oscuro

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)

Si algo no funciona o se muestra mal, escríbenos vía Formulario de contacto .

📖 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. 1
    Copia tu JWT
    Obtén el JWT desde la respuesta API o cabecera Authorization.
  2. 2
    Pega en el campo
    Pega el JWT en el textarea superior y la decodificación es automática.
  3. 3
    Inspecciona header y payload
    Ve el algoritmo (alg), emisor (iss), expiración (exp) y otras claims.

❓ Preguntas frecuentes

¿Qué es un JWT?
JWT (JSON Web Token) es un token de autenticación formado por header/payload/signature codificados en Base64URL.
¿Verifica la firma?
Solo decodifica. La verificación de firma requiere clave secreta o pública.
¿Se envía el JWT al servidor?
No. Todo se hace en JavaScript del navegador, sin peticiones de red.
¿Qué hago si exp está caducado?
Un JWT caducado es inválido. Usa el refresh token o vuelve a iniciar sesión.
🐛 ¿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.

* Se envía automáticamente la info del navegador (UA / pantalla / idioma / URL) para reproducir