Guía de herramienta
Cómo decodificar un JWT
Aprende qué es un JSON Web Token, su estructura, y cómo leer su contenido sin librerías externas.
¿Qué es un JWT?
Un JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define una forma compacta y autocontenida de transmitir información entre partes como un objeto JSON. Los JWT se usan comúnmente para autenticación y autorización en aplicaciones web y APIs.
A diferencia de las sesiones tradicionales que se guardan en el servidor, un JWT contiene toda la información necesaria dentro del propio token, lo que lo hace ideal para arquitecturas sin estado (stateless).
Estructura: header.payload.signature
Un JWT está compuesto por tres partes separadas por puntos (.):
1. Header (Encabezado)
Especifica el tipo de token y el algoritmo de firma utilizado.
{
"alg": "HS256", "color:rgba(255,255,255,0.35)">// Algoritmo: HS256, RS256, ES256...
"typ": "JWT" "color:rgba(255,255,255,0.35)">// Tipo de token
}2. Payload (Cuerpo)
Contiene los claims (afirmaciones): información sobre el usuario y metadatos del token. Hay claims estándar predefinidos:
{
"sub": "1234567890", "color:rgba(255,255,255,0.35)">// Subject: ID del usuario
"nombre": "Juan Pérez", "color:rgba(255,255,255,0.35)">// Claim personalizado
"rol": "admin", "color:rgba(255,255,255,0.35)">// Claim personalizado
"iat": 1700000000, "color:rgba(255,255,255,0.35)">// Issued At: cuándo fue emitido
"exp": 1700086400 "color:rgba(255,255,255,0.35)">// Expiration: cuándo expira (Unix timestamp)
}3. Signature (Firma)
La firma garantiza que el token no fue alterado. Se genera combinando el header y payload codificados, junto con una clave secreta del servidor. No puedes verificar la firma sin la clave secreta, pero sí puedes leer el payload.
Cómo decodificar manualmente con JavaScript
El header y el payload son simplemente texto JSON codificado en Base64url (una variante de Base64 que usa - y _ en lugar de + y /).
function decodeJWT(token) {
const [header, payload, signature] = token.split(".");
"color:rgba(255,255,255,0.35)">// Base64url → Base64 estándar → JSON
function decode(str) {
const base64 = str
.replace(/-/g, "+")
.replace(/_/g, "/");
return JSON.parse(atob(base64));
}
return {
header: decode(header),
payload: decode(payload),
signature, "color:rgba(255,255,255,0.35)">// No se puede decodificar sin la clave
};
}
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwicm9sIjoiYWRtaW4ifQ.xxx";
const decoded = decodeJWT(token);
console.log(decoded.payload.rol); "color:rgba(255,255,255,0.35)">// "admin"function isTokenExpired(token) {
try {
const [, payload] = token.split(".");
const data = JSON.parse(atob(payload.replace(/-/g, "+").replace(/_/g, "/")));
if (!data.exp) return false; "color:rgba(255,255,255,0.35)">// Sin expiración
const ahora = Math.floor(Date.now() / 1000); "color:rgba(255,255,255,0.35)">// Tiempo actual en segundos
return data.exp < ahora;
} catch {
return true; "color:rgba(255,255,255,0.35)">// Token malformado = tratarlo como expirado
}
}
if (isTokenExpired(miToken)) {
console.log("Token expirado, redirigir al login");
}Casos comunes
Leer el rol de un usuario
const token = localStorage.getItem("authToken");
const [, payload] = token.split(".");
const { rol, sub } = JSON.parse(atob(payload));
if (rol === "admin") {
"color:rgba(255,255,255,0.35)">// Mostrar opciones de administrador
}Algoritmos más usados
Herramienta relacionada
Decodificador de JWT
Pega tu token y visualiza el header y payload decodificados al instante, sin salir del navegador.
Abrir herramienta JWT →