Glosario · Testing de APIs
JWT (JSON Web Token)
En inglés: JWT
También llamado: JSON Web Token, token JWT, tokens JWT, token web JSON
Definición
Un JSON Web Token es un token compacto y firmado con la forma header.payload.signature que transporta claims como el id del usuario, la caducidad y la audiencia.
Un JSON Web Token (JWT, que en inglés suele pronunciarse “jot”) es una cadena con tres partes codificadas en Base64url y separadas por puntos: un header que indica cómo se firmó, un payload con los claims y una firma. Las APIs suelen recibirlo en la cabecera Authorization: Bearer <token> y verifican la firma para confiar en los claims sin consultar una base de datos. Muchos proveedores de OAuth 2.0 y OpenID Connect emiten access tokens e ID tokens como JWT.
Ejemplo
Un payload decodificado:
{
"iss": "https://auth.example.com",
"sub": "user_7f3a",
"aud": "orders-api",
"role": "member",
"iat": 1767225600,
"exp": 1767229200
}
iss es el emisor, sub el sujeto (normalmente el usuario), aud el destinatario previsto, e iat/exp las horas de emisión y de caducidad en segundos desde la época Unix. Leer el payload en Node 22 no requiere ninguna biblioteca:
const [, payload] = token.split('.');
const claims = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
Codificado, no cifrado
Un JWT firmado estándar (un JWS) está codificado, no cifrado. Cualquiera que tenga el token puede leer todos los claims, como muestra el fragmento anterior. La firma solo demuestra que el token lo emitió alguien que tiene la clave y que no se ha alterado. Así que nunca pongas secretos ni datos personales en el payload de un JWT a menos que el token esté realmente cifrado (un JWE, un formato distinto y menos habitual). Decodificar un token no es lo mismo que validarlo: una prueba que decodifica un token no ha comprobado nada sobre su autenticidad.
Qué probar
- Token caducado: fuerza o espera a que pase
expy espera un401. - Payload manipulado: cambia
roleaadmin, conserva la firma antigua y espera un401. Si se acepta, el servidor no está verificando las firmas. alg: none: un token sin firma debe rechazarse.- Audiencia o emisor incorrectos: un token válido para otra API no debería funcionar aquí.
- Token válido, permisos insuficientes: espera un
403, no un401, porque el usuario está autenticado pero no autorizado. - Cierre de sesión y revocación: los JWT suelen ser válidos hasta que caducan, así que comprueba qué hace el sistema después de cerrar sesión o cambiar la contraseña. La mitigación habitual es una caducidad corta más refresh tokens.