iGotTools

Decodifica e inspecciona tokens JWT de forma segura

Ve exactamente qué hay dentro de un JSON Web Token: emisor, expiración, scopes y claims. Decodifica en local y detecta tokens expirados o sospechosos antes de confiar en ellos.

Un JSON Web Token (JWT) es la cadena que tu navegador envía para demostrar quién eres tras iniciar sesión — y es legible por cualquiera que lo tenga. Eso no es una fuga del diseño; es el diseño. El riesgo real no es leer un token, sino dónde lo lees. Pegar un token vivo en un sitio decodificador cualquiera entrega tu sesión a un servidor que no controlas. El JWT Decoder nunca sube nada — decodifica el header, el payload y los claims totalmente en tu navegador, y lo dice claramente: la nota de seguridad bajo la entrada dice “Se decodifica localmente en tu navegador. La firma no se verifica.”

TL;DR

Un JWT no es un sobre sellado. Son tres partes Base64URL con una firma al final, y las dos primeras son texto plano disfrazado.

  • Un JWT tiene tres partesheader.payload.signature, cada una separada por un punto. Las dos primeras son JSON codificado en Base64URL.
  • Cualquiera que tenga el token puede leerlo — el header y el payload se decodifican en milisegundos, sin clave.
  • La firma demuestra integridad, no confidencialidad — permite al servidor confirmar que el token no fue alterado. No oculta el contenido.

Decodifica en local, lee lo que dice el token y nunca trates el payload como un lugar seguro para secretos.

Anatomía de un JWT

Cada JWT tiene exactamente tres segmentos Base64URL, unidos por puntos:

<header>.<payload>.<signature>

Toma el token de ejemplo de la herramienta (cárgalo con el botón Ejemplo) y mira los dos primeros segmentos. Parecen ruido, pero cada uno es solo JSON codificado en Base64URL. Decodificados, se leen:

  • Header{"alg":"HS256","typ":"JWT","kid":"example-demo"}. Declara el algoritmo, el tipo de token y el id de clave. Le dice al servidor cómo verificar, nada secreto.
  • Payload{"iss":"example-app","sub":"demo-user","name":"홍길동","scope":"read write","iat":1704067200,"nbf":1704067200,"exp":4102444800}. Estos son los claims: afirmaciones sobre el token — quién lo emitió, para quién es, qué permite y cuándo expira.
  • Signaturedemo-signature. En un token real este es un valor criptográfico que el servidor calcula sobre el header y el payload usando un secreto o clave privada. El ejemplo de la herramienta trae un marcador a propósito.

El header y el payload son las partes legibles. La firma es la única pieza que no puedes descifrar para recuperar la entrada original — y existe para demostrar que las otras dos no se cambiaron en tránsito, no para mantenerlas privadas. (Para la mitad de codificación de esta historia, ver Codificación Base64 vs cifrado — un JWT es un ejemplo práctico de “Base64 no es un secreto”.)

Claims estándar decodificados

El payload es una bolsa de claims — pares clave/valor acordados por convención. Los registrados que encontrarás casi siempre:

  • iss (emisor) — quién emitió el token, normalmente una URL o identificador.
  • sub (sujeto) — de quién trata el token, típicamente un id de usuario o cuenta.
  • aud (audiencia) — para quién se emitió el token. Un token emitido para el servicio de facturación debe ser rechazado por el servicio de perfil.
  • exp (expiración) — el momento en que el token deja de ser válido, como timestamp Unix. Es el claim más importante a comprobar.
  • iat (emitido en) — cuándo se creó el token.
  • nbf (no antes de) — el momento más temprano en que el token es válido. Combinado con iat, permite emitir tokens ligeramente por adelantado.

exp importa porque los tokens son credenciales al portador: quien presente uno válido entra. Los tokens de corta duración y expiración rápida limitan el daño si uno es robado. Un token con exp lejano es una clave de larga duración; un token sin exp es efectivamente permanente. Lee siempre la expiración antes de confiar en lo que un token afirma.

Paso a paso: decodificar un token

El JWT Decoder funciona totalmente en tu navegador — el token nunca sale de tu dispositivo. El flujo:

  1. Pega el token. Suelta una cadena completa header.payload.signature en la caja Entrada de token JWT. Usa Ejemplo para cargar el token de demo incluido en vez de pegar el tuyo.
  2. Decodifica. Haz clic en Decodificar. El panel derecho se llena con el resultado analizado. (Si editas la entrada después, la línea de estado dice “La entrada cambió. Decodifica de nuevo para actualizar.” para que nunca leas un análisis obsoleto.)
  3. Lee el panel Diagnóstico. Arriba lista Algoritmo, Tipo y Key ID extraídos del header, más el tamaño en bytes de cada segmento. Aquí afloran los tokens mal formados o con firma vacía — una advertencia aquí dice “El token está expirado.”, “El token aún no es válido.” o “El segmento de firma está vacío. Decodificar no verifica firmas.”
  4. Comprueba la línea de tiempo de claims. La tabla despliega los claims temporales — exp, iat, nbf — cada uno con sus segundos brutos, la lectura ISO UTC y un Estado de Activo, Pasado o Futuro. Una fila exp marcada Pasado es un token expirado; una fila nbf marcada Futuro significa que aún no es válido.
  5. Lee los paneles Header y Payload. Cada uno es JSON formateado con un botón Copiar. Es el contenido completo y decodificado del token — emisor, sujeto, scopes, todo.
  6. Copia lo que necesites. Usa Copiar en un panel o Copiar todo para un resumen de texto de header, payload y firma juntos. Usa Borrar para limpiar todo.

Todo es una operación de lectura. La herramienta no hace llamadas externas, no verifica la firma contra un emisor y no guarda el token — recarga la página y desaparece.

La confusión crítica

Como un JWT se usa para autenticación, la gente asume que su contenido es secreto. No lo es. El header y el payload están codificados en Base64URL, que es codificación, no cifrado — reversible por cualquiera en un paso, sin clave. (Es la misma trampa que tratar Base64 como seguridad; ver Codificación Base64 vs cifrado.)

Eso tiene una regla innegociable: nunca pongas un secreto en el payload de un JWT. Ni contraseñas, ni claves de API, ni números de tarjeta, ni credenciales de ningún tipo. Si está en el payload, asume que es público — porque en cuanto ese token sale del servidor, cualquiera en el camino puede leerlo. La firma garantiza que el token no fue alterado; no garantiza nada sobre quién puede verlo.

Cuando decodificas un token y el payload se lee bien, significa que el formato es honesto — no que el contenido sea privado. Diseña en consecuencia: pon en el payload solo lo que el cliente necesita, guarda los secretos reales en el servidor y deja que valores de exp cortos hagan la protección.

Comprobaciones relacionadas

Decodificar es la primera pregunta. Algunas herramientas relacionadas responden al resto:

  • Verifica las partes Base64. Cada segmento es Base64URL — confirma que hace viaje de ida y vuelta con la herramienta Base64. Es también cómo demuestras que el contenido de un JWT no está oculto: pega un segmento, decodifícalo y el JSON vuelve directamente.
  • Comprueba los timestamps. exp, iat y nbf son segundos Unix. Convierte uno en una fecha legible con el Conversor de Timestamp para ver exactamente cuándo expira un token o se volvió válido.
  • Integridad vía hash. La firma de un JWT demuestra que no fue alterado. Para el mismo trabajo en un archivo o cadena arbitraria, compara hashes con el generador de hash y checksum — un digest coincidente significa “sin cambios”, sin intercambiar clave.

Preguntas frecuentes

¿Es seguro decodificar un JWT?

Sí — decodificar un JWT es solo decodificar en Base64URL dos segmentos JSON. Revela lo que el token ya dice en texto plano a quien lo tenga; no debilita, expone ni invalida el token. Lo inseguro es dónde lo decodificas: pegar un token vivo en un sitio desconocido puede filtrar tu sesión. Decodifica en tu navegador con el JWT Decoder y el token nunca sale de tu dispositivo.

¿Puede la herramienta leer mi token?

No. El JWT Decoder funciona totalmente en el cliente. El token se analiza en la memoria de tu navegador; nada se sube, registra ni guarda en un servidor. La nota de seguridad bajo la entrada lo afirma directamente: “Se decodifica localmente en tu navegador.” Recarga la página y la entrada se limpia.

¿Qué significa “expirado” aquí?

Significa que el claim exp del token — su timestamp de expiración — está en el pasado, así que un servidor verificador debería rechazarlo. En la herramienta, un token expirado muestra exp como Pasado en la línea de tiempo de claims y lanza una advertencia “El token está expirado.” en el panel Diagnóstico. “Expirado” trata de validez, no de legibilidad: el token sigue decodificándose bien, solo que no debería confiarse en él.

¿Dónde se valida el token?

No en esta herramienta. El JWT Decoder decodifica — lee el header y el payload y muestra la línea de tiempo de claims. No verifica la firma contra la clave de un emisor, así que no puede decirte si un token es auténtico, solo lo que afirma. La validación real (comprobar la firma, exp, aud y emisor) ocurre en el servidor que emitió o confía en el token. Por eso la nota de seguridad es explícita: “La firma no se verifica.”

iGotTools

Comienza con esta herramienta

Empezar ahora