
JWT encode/decode: crear e inspeccionar un token en línea
Decodifica la cabecera y el payload de un JWT o firma un token de prueba en tu navegador: HS256, RS256, ES256, sin enviar el secreto a un servidor ajeno.
Un JWT lo puede leer cualquiera: decodifica para inspeccionar, firma para probar, verifica para confiar
Un JSON Web Token parece opaco, pero sus dos primeros segmentos son JSON corriente codificado en Base64URL: quien tenga el token puede leerlo. Es justo lo que necesitas cuando una API responde 401 y quieres saber qué afirma el token. El decodificador JWT en línea de FastMinify decodifica la cabecera y el payload en cuanto pegas el token, y el codificador JWT firma un token a partir de una cabecera y un payload JSON editables, en directo y sin botón de envío. Ambos funcionan en tu navegador: el token, los claims y el secreto no se envían a ninguna parte. Decodificar, sin embargo, no es verificar. Cualquiera puede escribir "role": "admin" en un payload, así que lo que dice un token decodificado no prueba nada sobre quién lo emitió. Comprobar una firma con las claves públicas de un emisor, la audiencia, el emisor y la expiración es tarea de jwt-verify, que acepta un JWKS pegado, y inspect-jwks muestra qué contiene un conjunto de claves así. Esta guía explica cómo se construye un JWT, cómo depurar un 401 o un 403 con un token decodificado, los errores que convierten una herramienta de pruebas en un agujero de seguridad y las mismas operaciones en Node con la biblioteca jose. Las herramientas están en el hub de herramientas de seguridad.
Codificar, decodificar o verificar: qué herramienta responde a cada pregunta
El decodificador y el codificador cubren todo lo que no exige establecer confianza en un emisor.
Confiar en un token requiere claves, claims y una política, no solo un payload legible. Pasa a jwt-verify, a inspect-jwks o a tu propio código.
Depurar un 401 o un 403 con un token decodificado
Pega el token en el decodificador y lee los claims de tiempo antes de tocar la API. exp, nbf e iat son valores NumericDate: segundos desde el 1 de enero de 1970 UTC (RFC 7519).
Cuando los claims son correctos y la API rechaza igualmente, el problema está en la cabecera o en la firma.
Un 403 significa que el token se aceptó y la autorización dijo que no. El payload suele explicar por qué.
Cuatro errores que convierten una herramienta de pruebas en un agujero de seguridad
Un decodificador muestra lo que un token afirma, no quién lo escribió. El payload no está protegido: quien tiene el token, o puede fabricar uno, puede meter cualquier claim. El codificador puede incluso producir un token no seguro con alg=none, cuyo segmento de firma está vacío: las herramientas lo etiquetan como «JWT sin firmar (alg=none)», y ningún verificador debería aceptarlo jamás. La RFC 8725 (buenas prácticas para JWT) pide a los servidores aceptar solo los algoritmos esperados y no dejar nunca que el token elija. La confusión de algoritmo es el fallo clásico: un token que declara HS256 y está firmado con la clave pública de un servicio RS256 pasa un verificador que lee alg de la cabecera y usa la clave pública como secreto HMAC.
Base64URL es una codificación, no un cifrado: la guía de Base64 explica la diferencia. Un JWT firmado (JWS) solo garantiza la integridad, así que todo el payload es legible. Existen tokens cifrados (JWE, RFC 7516, cinco partes en lugar de tres), pero el decodificador de aquí solo trata tokens firmados. Un token es además una credencial: quien lo tiene puede usarlo hasta exp. Esta herramienta lo mantiene en tu pestaña, pero compartir pantalla, una captura compartida o un ticket con el token pegado lo filtran igualmente.
HS256 firma con un secreto compartido, y la RFC 7518 pide una clave al menos tan larga como la salida del hash: 256 bits para HS256, 384 para HS384, 512 para HS512. Cuando tu secreto es más corto, el codificador muestra su tamaño en bits frente al mínimo recomendado. Esa cifra es la longitud de la clave, no su aleatoriedad: una frase de 32 caracteres en español mide 256 bits de largo y sigue siendo adivinable. Quien posee un solo token puede probar secretos candidatos sin conexión contra su firma, sin tocar nunca tu API. Genera el secreto al azar, por ejemplo con el generador de contraseñas (consulta la guía de contraseñas): unos 41 caracteres de su juego por defecto de 82 caracteres aportan 256 bits de entropía. La opción Base64URL cambia los bytes usados: marcada, la cadena del secreto se decodifica como Base64URL y sus bytes son la clave; sin marcar, los propios caracteres son la clave. El mismo texto con el ajuste equivocado da otra firma.
El codificador está pensado para fixtures y depuración. Reescribe iat a ahora, puede suprimir la firma por completo y los ejemplos que carga usan secretos desechables. Un token firmado aquí con un secreto de demostración nunca debe ser aceptado por un entorno real, y un secreto de firma real nunca debe pegarse en un archivo que luego subas al repositorio. Si ya ocurrió, cámbialo y analiza tu diff antes de hacer commit con el escáner de secretos.
Anatomía de un JWT: tres segmentos Base64URL y lo que dice cada uno
La forma compacta son tres segmentos Base64URL unidos por puntos. Es lo que viaja en una cabecera Authorization: Bearer.
Siete claims registrados (RFC 7519) cubren la mayoría de las sesiones de depuración. Todos son opcionales en la especificación, así que una API puede exigir más que el estándar.
El valor de alg decide quién puede emitir un token y quién solo puede comprobarlo.
Decodificar y codificar en las herramientas: el recorrido
El decodificador JWT no tiene botón: la decodificación se ejecuta mientras pegas o editas, tras una breve pausa. El editor empieza vacío; «Cargar ejemplo» o elegir un algoritmo carga un token de demostración.
Pega el token compacto
Solo los tres segmentos, sin el prefijo Bearer . Los espacios al principio y al final se ignoran.
Lee la cabecera y el payload
Ambos aparecen como JSON formateado en su propio panel, junto a la firma en bruto. Comprueba primero alg, kid, exp, aud e iss.
Comprueba la firma si hace falta
Pega el secreto HMAC o, para los algoritmos asimétricos, una clave pública en PEM o JWK. El resultado es «Firma verificada» o «Firma no válida», y cubre solo la firma.
Lee el error, si lo hay
El decodificador informa de un número de partes incorrecto, un segmento vacío, una firma ausente (permitida solo con alg=none) o un segmento que no es JSON en Base64URL.
El codificador JWT firma mientras escribes. El token aparece en cuanto la cabecera, el payload y la clave son válidos.
Elige el algoritmo
Usa la barra de herramientas o edita alg en el JSON de la cabecera. Un alg ausente o no compatible se señala como cabecera no válida.
Escribe los claims
Un objeto JSON. iat se sobrescribe con la hora actual en cada codificación, así que no puedes fijar un iat antiguo.
Fija una expiración si la necesitas
El menú Expiración (15 minutos, 1 hora, 24 horas) sobrescribe cualquier exp del JSON. «Ninguna» deja tu payload como está.
Proporciona la clave
Un secreto para HMAC, o una clave privada PEM (PKCS#8) o JWK para RSA, ECDSA y EdDSA. Un secreto por debajo de la longitud recomendada muestra un aviso con su tamaño en bits.
Copia el token y compruébalo
Pégalo en el decodificador para ver lo que has producido y luego en jwt-verify para probar una política de verificación real.
Algunos límites que conviene conocer antes de apoyarse en ellas para un uso concreto.
Las mismas operaciones en tu propio código
Decodificar no requiere biblioteca: divide por los puntos y lee cada segmento como Base64URL. Es lo que hace el decodificador, con el mismo límite: no se comprueba nada.
Ejemplo básico
La biblioteca jose firma un JWT compacto y rellena los claims registrados por ti. A diferencia del codificador de aquí, setIssuedAt() usa el reloj real, como corresponde en producción.
Ejemplo básico
La verificación es donde se establece la confianza: fija el algoritmo, el emisor y la audiencia, y permite una pequeña tolerancia de reloj.
Ejemplo básico
Nada que instalar y nada enviado: el decodificador y el codificador cubren la lectura de claims, la creación de fixtures y la comprobación de una firma de la que tienes la clave. Las contrapartidas: sin validación de claims, sin conversión de marcas de tiempo, sin JWE, EdDSA limitado a Ed25519. Para una decisión de confianza real, usa una biblioteca de verificación en el servidor, o pega un JWKS en jwt-verify para probar antes tu política.
Conclusión
Un JWT es un sobre firmado, no sellado: su payload lo puede leer cualquiera, y solo la firma indica que no se ha modificado. El decodificador JWT hace visibles los claims en segundos, que es casi todo lo que necesita un 401 o un 403, y el codificador JWT crea un token para reproducir un caso. Ninguno de los dos establece confianza. Eso requiere las claves del emisor, un algoritmo fijado y comprobaciones de aud, iss y exp, que es lo que hacen jwt-verify y tu propio código de servidor. Mantén los secretos de prueba fuera de producción, genera los secretos HMAC al azar y rechaza alg=none. El hub de herramientas de seguridad reúne las herramientas vecinas para claves, certificados y secretos.
Artículos relacionados

Longitud, entropía, símbolos: genera una contraseña robusta en el navegador con Web Crypto y conoce lo que la herramienta no garantiza.

Prueba una regex de JavaScript, revisa los grupos de captura y previsualiza un reemplazo $1 en el navegador, antes de pasarla a producción.

UUID v4 aleatorio, UUID v7 y ULID ordenables, Nanoid compacto: comparativa y generadores en línea para claves primarias e IDs públicos.