Comprende las reclamaciones de tokens JWT incluyendo exp, iat, nbf, iss, sub, aud. Cubre skew de reloj, patrones de renovación de tokens y errores comunes.
Un JWT son tres segmentos codificados en base64url separados por puntos: header.payload.signature. El payload contiene reclamaciones, que son pares clave-valor que llevan datos de identidad y autorización. Cada reclamación es visible para cualquiera que tenga el token. No hay encriptación, solo una firma que verifica que el token fue emitido por una parte confiable.
Las reclamaciones se dividen en tres categorías:
iss, sub, aud, exp, nbf, iat y jti.role, org_id, permissions).Estas tres reclamaciones forman el ciclo de vida de un token:
iat ──────────── nbf ──────────── token activo ──────────── exp
│ │
└── token empieza a ser válido └── token expira
iat (Emitido En)
La marca de tiempo Unix cuando se creó el token. Es informativa. No afecta la validación a menos que la lógica de tu aplicación la use para imponer una edad máxima del token.
{
"iat": 1735603200
}
1735603200 = 1 de enero de 2025 a las 00:00:00 UTC.
nbf (No Antes De)
La marca de tiempo Unix cuando el token se vuelve válido. Si un token llega con un nbf en el futuro, el servidor debe rechazarlo. Esto es raro en la práctica. La mayoría de los sistemas establecen nbf igual a iat.
{
"nbf": 1735603200
}
exp (Expiración)
La marca de tiempo Unix cuando el token se vuelve inválido. Esta es la reclamación de tiempo clave. El servidor debe rechazar cualquier token con exp en el pasado.
{
"exp": 1735689600,
"iat": 1735603200
}
La diferencia es 86400 segundos (24 horas). Este token tiene una vida útil de un día.
Más allá de las reclamaciones de tiempo, el spec JWT define varias reclamaciones estándar:
| Reclamación | Nombre | Propósito | Ejemplo |
|---|---|---|---|
iss |
Emisor | Quién creó el token | "https://api.example.com" |
sub |
Sujeto | A quién representa el token | "user_12345" |
aud |
Audiencia | Para quién es el token | "https://app.example.com" |
exp |
Expiración | Cuándo expira el token | 1735689600 |
nbf |
No Antes De | Cuándo se vuelve válido el token | 1735603200 |
iat |
Emitido En | Cuándo se creó el token | 1735603200 |
jti |
ID JWT | Identificador único del token | "abc-123-def" |
iss (Emisor): Identifica quién creó el token. Tu servidor de auth debe validar esto para prevenir que tokens de otros emisores sean aceptados.
sub (Sujeto): La entidad que representa el token. Típicamente un ID de usuario o nombre de cuenta de servicio. Usa esto en tu lógica de autorización para identificar quién está haciendo la petición.
aud (Audiencia): Para quién fue emitido el token. Si tu sistema tiene múltiples servicios (ej. API gateway, servicio de usuario, servicio de pago), cada uno debe verificar que el claim aud coincida con su propio identificador.
jti (ID JWT): Un identificador único para el token. Usa esto para revocación de tokens. Almacena el jti en una lista de denegación cuando el usuario cierra sesión o el token es revocado.
Los relojes de los servidores nunca están perfectamente sincronizados. Si el reloj del servidor de auth está 30 segundos adelante del servidor de API, un token con exp = 1735689600 podría validarse contra un servidor que cree que ya son 1735689631.
La solución es una ventana de tolerancia:
// Node.js con jsonwebtoken
jwt.verify(token, secret, { clockTolerance: 30 }); // 30 segundos de tolerancia
// Go con golang-jwt
token, err := jwt.Parse(tokenString, keyFunc,
jwt.WithLeeway(30 * time.Second),
)
Una tolerancia de 30-60 segundos es estándar. No la establezcas en cero o verás errores 401 intermitentes difíciles de depurar.
Usar exp con segundos vs milisegundos
Algunas librerías usan segundos (estándar RFC 7519), otras milisegundos. Un token con exp: 1735689600 (segundos) parece año 56935 si se interpreta como milisegundos. Verifica la expectativa de tu librería.
Establecer exp demasiado lejos en el futuro
Un token con vida útil de 30 días significa que un token robado es usable por 30 días. Los access tokens deben expirar en 15-60 minutos.
Validación aud faltante
Si tu API no verifica el claim aud, un token emitido para un servicio diferente puede usarse contra tu endpoint. Siempre valida iss y aud.
Almacenar datos sensibles en reclamaciones
Las reclamaciones son legibles por cualquiera que tenga el token. No pongas contraseñas, SSN o claves privadas en reclamaciones JWT.
Pega el token de ejemplo en JWT Decoder para ver todas las reclamaciones decodificadas. El payload contiene:
{
"iss": "https://api.example.com",
"sub": "user_12345",
"aud": "https://app.example.com",
"exp": 1735689600,
"iat": 1735603200,
"nbf": 1735603200,
"role": "admin",
"permissions": ["read", "write", "delete"]
}
El token fue emitido a medianoche UTC del 1 de enero de 2025, expira 24 horas después, y otorga acceso de admin a user_12345.
Nothing you paste leaves this tab. Every tool runs entirely in your browser — no upload, no server, no account.