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 (.):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibm9tYnJlIjoiSnVhbiBQw6lyZXoiLCJyb2wiOiJhZG1pbiIsImlhdCI6MTcwMDAwMDAwMCwiZXhwIjoxNzAwMDg2NDAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header
Payload
Signature

1. Header (Encabezado)

Especifica el tipo de token y el algoritmo de firma utilizado.

Header decodificado
{
  "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:

Payload decodificado
{
  "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 /).

Decodificar con atob() en el navegador
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"
Verificar si el token expiró
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

AlgoritmoTipoUso recomendado
HS256SimétricoApps con un solo servidor
RS256AsimétricoMicroservicios, OAuth 2.0
ES256Asimétrico (ECDSA)Alto rendimiento, mobile
Importante: El payload de un JWT está en Base64, no cifrado. Cualquier persona con el token puede leer su contenido. Nunca incluyas contraseñas ni información sensible en el payload.

Herramienta relacionada

Decodificador de JWT

Pega tu token y visualiza el header y payload decodificados al instante, sin salir del navegador.

Abrir herramienta JWT →