Decodificador JWT gratuito
Decodifica e inspecciona JSON Web Tokens · cabecera, payload, claims y caducidad.
Cabecera
Payload
Firma
Acerca de los JWT
Los JSON Web Tokens (JWT) son una forma compacta de representar claims entre dos partes. Constan de tres partes: una cabecera (algoritmo y tipo), un payload (claims como emisor, caducidad y sujeto) y una firma. Esta herramienta decodifica la cabecera y el payload, pero no verifica las firmas · para ello necesitas el secreto de firma o la clave pública. Toda la decodificación se realiza en tu navegador; tu token nunca se envía a ningún sitio.
Una breve historia de los JSON Web Tokens
El JSON Web Token (JWT) fue estandarizado como RFC 7519 en mayo de 2015 por Michael B. Jones (Microsoft), John Bradley (Ping Identity) y Nat Sakimura (NRI) bajo el Grupo de Trabajo JOSE del IETF. Fue la culminación de media década de trabajo: el primer borrador internet de JWT apareció en diciembre de 2010, surgiendo del pesado formato de aserciones basado en XML de SAML 2.0 (2005) y de la necesidad sentida de algo más ligero que los navegadores pudieran analizar de forma nativa. El gran avance fue elegir JSON sobre XML y base64url sobre PEM: un JWT podía caber en una cadena de consulta URL o en un encabezado Authorization: Bearer. Toda la familia JOSE se entregó como un conjunto coordinado: RFC 7515 (JWS) para firma, RFC 7516 (JWE) para cifrado, RFC 7517 (JWK) para el formato de clave, RFC 7518 (JWA) para identificadores de algoritmo y RFC 7519 (JWT) para la capa de afirmaciones, todos el mismo día de mayo de 2015. La adopción fue instantánea. OAuth 2.0 (RFC 6749, 2012) había estandarizado los tokens de acceso pero dejó su formato opaco; la industria eligió JWT. OpenID Connect (diciembre de 2014, OpenID Foundation) hizo que JWT fuera obligatorio para los tokens ID. Para 2017, todos los principales proveedores de identidad (Auth0, Okta, Azure AD, AWS Cognito, Google Identity, Firebase Auth) emitían JWT como su formato de sesión nativo. JWT.io, el sitio web decodificador que Auth0 lanzó en 2014, se convirtió en la herramienta de facto para depurar JWT y ayudó a cimentar la cuota mental del formato entre desarrolladores. Dos incidentes de seguridad dieron forma al modelo de amenazas moderno: la divulgación de Tim McLean en 2015 del bypass alg: none y el ataque de confusión de algoritmo HS/RS, y CVE-2022-21449 (abril de 2022), el bug «Psychic Signatures» de Neil Madden en el verificador ECDSA de Java 15-18. Ambos llevaron al endurecimiento por defecto de las bibliotecas: la mayoría de las bibliotecas modernas ahora rechazan alg: none de plano y fijan el algoritmo esperado en lugar de leerlo del encabezado del token.
La anatomía de un JWT
- Tres segmentos codificados en base64url. Un JWT es la cadena
header.payload.signature: tres segmentos separados por puntos, cada uno codificado en base64url. La RFC 7519 llama a esto la JWT Compact Serialization. Todo cabe en una URL o un encabezado HTTP; esa compacidad fue el objetivo de diseño que distinguió a JWT de predecesores basados en XML como SAML. - Encabezado. Un pequeño objeto JSON que normalmente contiene dos campos:
alg(el algoritmo de firma, por ejemplo HS256, RS256, ES256) ytyp(casi siempre «JWT»). Los campos opcionales incluyenkid(un identificador de clave usado para la rotación de claves) ycty(tipo de contenido para tokens anidados). El encabezado le dice al verificador cómo validar la firma; nunca confíes solo en él, siempre fija el algoritmo esperado del lado del servidor. - Payload. Un objeto JSON de afirmaciones, aserciones clave-valor sobre un sujeto. La RFC 7519 §4.1 reserva siete afirmaciones estándar:
iss(emisor),sub(sujeto),aud(audiencia),exp(expiración),nbf(no antes),iat(emitido en) yjti(ID JWT único). Los emisores añaden afirmaciones personalizadas libremente. El payload está firmado pero no cifrado: cualquiera con el token puede leerlo. - Firma. La prueba criptográfica de que el encabezado y el payload no han sido manipulados. La entrada de firma es la cadena literal
base64url(header) + "." + base64url(payload); la firma misma se codifica luego en base64url como tercer segmento. La verificación requiere el secreto simétrico (HS*) o la clave pública asimétrica (RS*, ES*, PS*, EdDSA) y siempre debe ocurrir en un servidor de confianza. - base64url, no base64. Los segmentos JWT usan la variante base64 segura para URL definida en la RFC 4648 §5: el carácter 62 es
-en lugar de+, el carácter 63 es_en lugar de/, y el relleno final=se elimina. Elatob()incorporado de JavaScript solo maneja base64 estándar, así que los decodificadores JWT traducen el alfabeto y re-rellenan antes de decodificar. - NumericDate: segundos, no milisegundos. La RFC 7519 define
exp,nbfeiatcomo «el número de segundos desde 1970-01-01T00:00:00Z UTC». ElDate.now()de JavaScript devuelve milisegundos, así que un error común es unexptres órdenes de magnitud demasiado grande, produciendo un token que «expira» alrededor del año 53.000. Usa siempreMath.floor(Date.now() / 1000)al emitir tokens.
Dónde se usan los JWT en la práctica
- Tokens de acceso OAuth 2.0. La RFC 6749 dejó el formato del token de acceso opaco, pero en la práctica la industria se estandarizó en JWT. Auth0, Okta, Azure AD, AWS Cognito y Google Identity emiten todos tokens de acceso JWT por defecto. El token Bearer en tu encabezado
Authorizationes casi siempre un JWT. - Tokens ID de OpenID Connect. OIDC (diciembre de 2014) obliga a JWT para su
id_token. Elid_tokenlleva afirmaciones de identidad sobre el usuario autenticado (sub,email,name,picture) y es consumido por la parte confiante en lugar de pasarse adelante. Este es el mecanismo principal detrás de «Iniciar sesión con Google», «Iniciar sesión con Apple» y flujos equivalentes. - Autenticación de API. Las API REST sin estado adoptan JWT porque elimina la necesidad de un almacén de sesiones del lado del servidor: la API confía en lo que la firma verifica. Las claves API estilo Stripe siguen siendo comunes para tráfico servidor-a-servidor, pero para API con alcance de usuario, el patrón
Authorization: Bearer <jwt>es ahora el predeterminado. - Autenticación microservicio-a-microservicio. Un JWT con alcance de usuario emitido en el borde de la API se reenvía a través de llamadas internas servicio-a-servicio, permitiendo que cada servicio confíe en la autenticación original sin re-autenticar. El patrón a veces se llama «traducción de token»: la puerta de enlace de borde intercambia una sesión opaca por un JWT de corta duración con alcance a la llamada descendente.
- Sesiones de aplicaciones de página única. Las SPA (React, Vue, Angular) históricamente almacenaron tokens de acceso en
localStoragepor conveniencia. La guía moderna (OWASP, Auth0) es mantener los tokens de acceso en memoria y los tokens de refresco en cookiesHttpOnly + Secure + SameSite=Strict, porquelocalStoragees legible por cualquier XSS que aterrice en la página. - Sesiones de aplicaciones móviles. Las apps de iOS y Android almacenan tokens de acceso en el Keychain o Keystore de la plataforma. El token se envía como
Authorization: Beareren cada llamada al backend. Los tokens de refresco se rotan en cada uso, y el cortoexpdel token de acceso (típicamente 5-15 minutos) es la defensa principal contra la repetición en caso de dispositivo robado.
Estándares e hitos de seguridad
- RFC 7519 (JWT, mayo de 2015). La especificación base. Define la JWT Compact Serialization, las siete afirmaciones estándar registradas (
iss,sub,aud,exp,nbf,iat,jti) y el formato NumericDate. Autores: Michael B. Jones, John Bradley, Nat Sakimura. - RFC 7515 (JWS, mayo de 2015). JSON Web Signature. El formato de envoltorio firmado que casi todos llaman informalmente «JWT»: tres segmentos base64url unidos por puntos. JWS admite tanto la forma compacta como la JSON Serialization; JWT solo usa la forma compacta.
- RFC 7516 (JWE, mayo de 2015). JSON Web Encryption. La variante cifrada con cinco segmentos (encabezado, clave cifrada, IV, texto cifrado, etiqueta de autenticación). Usa JWE, no JWS, cuando el payload deba ser confidencial, no simplemente evidente ante manipulación.
- RFC 7517 (JWK, mayo de 2015). JSON Web Key. La representación JSON de claves criptográficas. El punto final JWKS (
/.well-known/jwks.json) publica un JSON Web Key Set, el mecanismo moderno para rotación de claves sin tiempo de inactividad: los verificadores buscan claves porkid. - RFC 7518 (JWA, mayo de 2015). JSON Web Algorithms. El registro de identificadores
alg: HS256/384/512 (HMAC), RS256/384/512 (RSASSA-PKCS1-v1_5), ES256/384/512 (ECDSA), PS256/384/512 (RSASSA-PSS), EdDSA (Ed25519/Ed448) y elnone(intencionalmente poco usado). - El bypass
alg: none(Tim McLean, 2015). La RFC 7518 listanonecomo un valor de algoritmo válido para contextos no asegurados. Los verificadores ingenuos aceptaban un token con el encabezado reescrito a{"alg":"none"}y una firma vacía, permitiendo a un atacante falsificar cualquier payload. Las bibliotecas modernas rechazannonepor defecto; la propia especificación indica que los verificadores «NO DEBEN aceptar JWS no asegurados por defecto». - Ataque de confusión de algoritmo HS/RS (Tim McLean, 2015). Si un verificador elige el algoritmo del encabezado del token en lugar de fijarlo, un atacante puede reescribir el encabezado a
HS256y firmar el token usando la clave pública RSA del servidor como secreto HMAC. La biblioteca ve HS256, trata la clave pública RSA configurada como un secreto simétrico, y la firma se verifica. Mitigación: fija el algoritmo esperado fuera de banda; nunca lo derives del token. - CVE-2022-21449 «Psychic Signatures» (Neil Madden, abril de 2022). El verificador ECDSA de Java 15-18 no comprobaba que los valores
rysde la firma fueran distintos de cero, lo que significa que una firma literal toda en ceros era aceptada como válida. Los JWT firmados con ES256/384/512 en las JVM afectadas podían falsificarse con una firma en blanco. Parcheado en la Actualización Crítica de Parches de Oracle de abril de 2022.
Preguntas frecuentes adicionales
¿Por qué esta herramienta no verifica la firma?
La verificación necesita un secreto (HMAC) o clave pública (RSA / ECDSA / EdDSA). Pegar un secreto HMAC de producción en cualquier sitio web es en sí mismo una fuga de credenciales, incluso en una herramienta que jura no transmitir nada. La verificación pertenece a un servidor que controlas. El trabajo del decodificador es hacer que el contenido sea legible para que puedas ver qué debería estar comprobando tu verificador.
¿Es seguro pegar tokens reales de producción aquí?
La decodificación sucede enteramente en tu navegador. El token no se envía por la red, ni se escribe en ningún registro, ni se almacena en ninguna parte. Dicho esto, un JWT a menudo es una credencial: quienquiera que tenga un token de acceso no expirado puede actuar como el usuario. La convención de la comunidad es «trata un JWT de producción como una cookie de sesión»: prefiere tokens de prueba cuando puedas, y rota cualquier token real que hayas compartido fuera de la sesión del navegador que lo emitió.
¿Dónde debo almacenar un JWT en el navegador?
Los dos patrones comunes tienen cada uno un compromiso. localStorage es conveniente pero legible por cualquier ataque XSS exitoso en la página. Cookies con HttpOnly son invisibles para JavaScript así que XSS no puede leerlas, pero necesitan SameSite=Strict o SameSite=Lax para evitar CSRF. La mejor práctica actual: tokens de acceso de corta duración en una variable JavaScript (solo memoria) más un token de refresco de larga duración en una cookie HttpOnly + Secure + SameSite=Strict con alcance al punto final de refresco, rotada en cada uso.
¿Qué hace el campo kid en el encabezado?
Identifica qué clave firmó el token. Los proveedores de identidad modernos publican sus claves públicas en un punto final /.well-known/jwks.json como un JWK Set (RFC 7517); el verificador busca la clave cuyo kid coincida con el encabezado del token. Esto es lo que hace posible la rotación de claves sin tiempo de inactividad: ambas claves vieja y nueva pueden coexistir en el JWKS durante el período de gracia.
¿Puedo revocar un JWT una vez emitido?
No de forma nativa. Un JWT firmado es válido hasta su afirmación exp; esa apatridia es la propiedad estrella del formato. Soluciones alternativas: mantener tokens de acceso cortos (5-15 minutos) emparejados con un token de refresco revocable; mantener una lista de denegación del lado del servidor de valores jti revocados; rotar la clave de firma (lo que invalida cada token pendiente firmado con ella). Cada opción reintroduce algo de estado; ese es el trato.
¿Es decodificar un token lo mismo que descifrarlo?
No. Decodificar invierte base64url de vuelta a JSON: cualquiera puede hacerlo, y ese es el punto. Descifrar requiere una clave y solo se aplica a JSON Web Encryption (JWE, RFC 7516), que es la variante cifrada de la familia JOSE. La mayoría de los tokens que ves en la naturaleza son JWS (firmados pero no cifrados), así que decodificarlos es suficiente para leerlos.
Herramientas relacionadas
Generador de hash gratuito
Genera hashes MD5, SHA-1, SHA-256, SHA-384 y SHA-512 a partir de texto o archivos. Admite firma HMAC. Basado en el navegador, sin subidas.
Codificador y decodificador Base64 gratuito en línea
Codifica texto a Base64 o decodifica Base64 a texto al instante. Admite la conversión de archivo a Base64. Gratis, sin registro, funciona en tu navegador.
Cifrado y descifrado de texto
Cifra y descifra texto utilizando AES-256-GCM directamente en tu navegador. Sólo del lado del cliente: tus datos nunca salen de tu dispositivo.