Decodificador JWT
Decodifica e inspecciona JSON Web Tokens
Token JWT
¿Qué es un JWT (JSON Web Token)?
Un JSON Web Token (JWT) es un formato de token compacto y seguro para URLs, definido en RFC 7519. Codifica un conjunto de claims como un objeto JSON, luego lo firma — y opcionalmente lo cifra — para que el destinatario pueda verificar que los datos no han sido alterados. Los JWT son el estándar de facto para la autenticación sin estado en REST APIs, sistemas de inicio de sesión único y autorización de microservicios.
Anatomía del JWT: Encabezado · Payload · Firma
Todo JWT está formado por tres segmentos codificados en base64url separados por puntos. El encabezado y el payload son JSON plano — legibles por cualquiera — mientras que la firma es un valor criptográfico que solo puede verificarse con la clave correcta.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE3MjAwMDAwLCJleHAiOjE3MTcyMDM2MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user123",
"name": "Alice",
"role": "admin",
"iat": 1717200000,
"exp": 1717203600
}¿Por qué usar un decodificador de JWT?
Los JWT sin procesar parecen texto aleatorio. Esta herramienta muestra al instante el encabezado y el payload como JSON formateado para que puedas inspeccionar los claims, verificar los tiempos de expiración y auditar las opciones de algoritmo sin escribir una sola línea de código.
Referencia de claims estándar de JWT
RFC 7519 define siete nombres de claims registrados. No son obligatorios, pero su uso es muy recomendado para la interoperabilidad. Puedes añadir cualquier claim personalizado al payload.
| Claim | Descripción | Tipo |
|---|---|---|
| iss | Emisor — Identifica quién emitió el token — p. ej. la URL de tu servidor de autenticación o el nombre de la aplicación. | string |
| sub | Sujeto — Identifica al principal sobre el que trata el JWT — típicamente un ID de usuario o cuenta de servicio. | string |
| aud | Audiencia — Identifica a los destinatarios previstos. El receptor debe verificar que coincide con su identificador. | string | string[] |
| exp | Tiempo de expiración — Marca de tiempo Unix después de la cual el token no debe ser aceptado. Siempre configúrala para limitar el daño de un token robado. | number |
| nbf | No antes de — Marca de tiempo Unix antes de la cual el token no debe ser aceptado. Útil para programar tokens con fecha futura. | number |
| iat | Emitido en — Marca de tiempo Unix en la que se emitió el token. Se usa para calcular la antigüedad del token. | number |
| jti | JWT ID — Un identificador único para el token. Permite la revocación almacenando y verificando los valores JTI usados en el servidor. | string |
Algoritmos de firma de JWT
El claim de encabezado alg declara qué algoritmo firmó el token. La elección afecta la seguridad, el rendimiento y si los servicios de terceros pueden verificar tokens sin la clave privada.
| Algoritmo | Familia | Tipo de clave | Notas |
|---|---|---|---|
| HS256 | HMAC | Symmetric | El más común. Secreto compartido — cualquiera con el secreto puede firmar y verificar. |
| HS384 | HMAC | Symmetric | Variante HMAC más robusta; coste de rendimiento moderado. |
| HS512 | HMAC | Symmetric | Variante HMAC más fuerte. |
| RS256 | RSA | Asymmetric | Algoritmo asimétrico más usado (Google, Auth0, Okta). La clave pública verifica sin necesitar la privada. |
| RS384 | RSA | Asymmetric | Variante RS de mayor seguridad. |
| RS512 | RSA | Asymmetric | Variante RS más robusta. |
| ES256 | ECDSA | Asymmetric | Curva elíptica — firmas más cortas que RSA, popular en móvil e IoT. |
| PS256 | RSA-PSS | Asymmetric | RSA-PSS: más moderno y seguro que RS256 basado en PKCS1v1.5. |
| none | — | — | Sin firma — críticamente peligroso. Nunca aceptes tokens con alg: none en producción. |
Consideraciones de seguridad
Decodificar un JWT siempre es seguro. Confiar en un JWT sin la verificación adecuada de la firma no lo es. Ten en cuenta estas reglas siempre que consumas tokens en tu aplicación.
- –Decodificar e inspeccionar un JWT en las herramientas de desarrollador o en esta herramienta
- –Usar exp, iat y nbf para entender el tiempo de vida del token
- –Registrar claims del payload para depuración (omitir PII sensible)
- –Leer el encabezado alg para entender cómo se firmó el token
- –Confiar en los claims del payload sin verificar la firma en el servidor
- –Aceptar tokens con alg: none — esto significa que no hay firma en absoluto
- –Almacenar tokens de acceso en localStorage en aplicaciones de alta seguridad (preferir cookies httpOnly)
- –Establecer exp muy en el futuro para tokens que llevan permisos sensibles
Casos de uso comunes
Decodificando JWT en código
El encabezado y el payload están codificados en base64url — simplemente invierte la codificación. Base64url reemplaza + por - y / por _, y omite el relleno =. Solo la firma requiere la clave secreta.
function decodeJWT(token) {
const [, payload] = token.split('.')
const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
return JSON.parse(json)
}const [, payload] = token.split('.')
const decoded = JSON.parse(
Buffer.from(payload, 'base64url').toString()
)import base64, json
def decode_jwt(token):
payload = token.split('.')[1]
padding = '=' * (-len(payload) % 4)
return json.loads(base64.urlsafe_b64decode(payload + padding))TOKEN="eyJhbGc..." echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .