Guía Completa de Seguridad JWT: Decodificación, Verificación y Vulnerabilidades Comunes
¿Qué es JWT?
JWT (JSON Web Token) es un estándar abierto (RFC 7519) para transmitir información de forma segura entre partes. Es el esquema de autenticación de API más popular, ampliamente utilizado por OAuth 2.0 y OpenID Connect.
Estructura de JWT
Un JWT tiene tres partes separadas por .:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│ Header │.│ Payload │.│ Signature │
| Parte | Contenido | Codificación |
|---|---|---|
| Header | Algoritmo + tipo | Base64URL |
| Payload | Claims | Base64URL |
| Signature | Firma | Algoritmo(Header + Payload, Secreto) |
⚠️ El Header y el Payload solo están codificados en Base64URL—no están cifrados. Cualquiera puede decodificarlos y leerlos.
Decodificar JWT con ToolsKu
Pasos
- Abra el Decodificador JWT
- Pegue la cadena JWT
- Vea el Header y Payload JSON decodificados
- Verifique la expiración, el emisor y otros campos
Campos Comunes del Payload
| Campo | Significado | Ejemplo |
|---|---|---|
sub |
Sujeto (ID de usuario) | "user_12345" |
iss |
Emisor | "https://auth.example.com" |
aud |
Audiencia | "api.example.com" |
exp |
Expiración (segundos Unix) | 1717200000 |
iat |
Emitido el | 1717196400 |
nbf |
No antes de | 1717196400 |
jti |
ID del JWT (identificador único) | "a1b2c3d4" |
Algoritmos de Firma JWT
| Algoritmo | Tipo | Seguridad | Caso de Uso |
|---|---|---|---|
| HS256 | Simétrico | Media | Servicio único, APIs internas |
| HS384/HS512 | Simétrico | Media–alta | Requisitos de seguridad más altos |
| RS256 | Asimétrico | Alta | Multi-servicio, OAuth |
| ES256 | Asimétrico | Alta | Móvil, IoT |
| none | Sin firma | ❌ Peligroso | Nunca usar |
Simétrico vs Asimétrico
HS256 (simétrico):
Firmar: HMAC-SHA256(header.payload, shared_secret)
Verificar: Mismo shared_secret
Problema: Todos los servicios comparten un secreto—una fuga afecta todo
RS256 (asimétrico):
Firmar: RSA-SHA256(header.payload, private_key)
Verificar: RSA-SHA256(header.payload, public_key)
Ventaja: La clave pública puede distribuirse; la clave privada permanece con el emisor
Vulnerabilidades de Seguridad Comunes
1. Ataque alg: none
Un atacante cambia el alg del Header a none y elimina la Firma:
// Header Original
{"alg": "HS256", "typ": "JWT"}
// Modificación del atacante
{"alg": "none", "typ": "JWT"}
Defensa: El servidor debe tener una lista blanca de algoritmos permitidos y rechazar none.
2. Ataque de Confusión de Claves
Cambiar RS256 a HS256 y usar la clave pública como secreto HMAC:
Atacante obtiene clave pública → cambia alg a HS256 → firma con clave pública → servidor verifica HMAC con clave pública → pasa
Defensa: Validar estrictamente que el alg del Header coincida con lo esperado.
3. Fuga de Datos Sensibles
Como el Payload solo está codificado en Base64, nunca almacene en JWT:
- ❌ Contraseñas, números de tarjeta de crédito
- ❌ Información privada personal
- ✅ ID de usuario, roles, permisos
4. Expiración Inadecuada
// ❌ Sin expiración — token válido para siempre
{"sub": "user_123"}
// ❌ Expiración demasiado larga — token filtrado permanece válido
{"sub": "user_123", "exp": 1893456000} // año 2030
// ✅ Expiración razonable + flujo de refresh
{"sub": "user_123", "exp": 1717200000} // 15–60 minutos
Mejores Prácticas JWT
1. Access Token de Corta Duración + Refresh Token
Access Token: Expiración de 15–60 minutos, usado para llamadas API
Refresh Token: Expiración de 7–30 días, usado para obtener nuevos access tokens
2. Ubicación de Almacenamiento
| Almacenamiento | Riesgo XSS | Riesgo CSRF | Recomendado |
|---|---|---|---|
| localStorage | Alto | Bajo | ❌ |
| sessionStorage | Alto | Bajo | ❌ |
| HttpOnly Cookie | Bajo | Alto | ⚠️ Necesita protección CSRF |
| Variable en memoria | Bajo | Bajo | ✅ Recomendado para SPAs |
3. Lista de Verificación
Al validar JWT en el servidor, siempre verifique:
- La firma es válida
-
expno ha expirado -
nbfestá en vigor -
isses el emisor esperado -
audincluye el servicio actual -
algestá en la lista blanca
Depuración de Problemas JWT
- Decodificar JWT: Use el Decodificador JWT para inspeccionar Header y Payload
- Verificar exp: ¿El token ha expirado?
- Verificar alg: ¿El algoritmo de firma coincide con lo esperado?
- Verificar iss/aud: ¿Son correctos el emisor y la audiencia?
- Verificar firma: Use el Generador JWT para volver a firmar con el mismo secreto y comparar
- Verificar transporte: ¿El header Authorization es
Bearer <token>?
Herramientas Relacionadas
- Decodificador JWT — Analizar Header y Payload
- Generador JWT — Crear JWTs personalizados para pruebas
- Calculadora HMAC — Entender la firma HMAC
- Codificación/Decodificación Base64 — Codificación usada por JWT
Resumen
JWT es una piedra angular de la autenticación API moderna, pero la codificación Base64 (no cifrado) crea desafíos de seguridad únicos. Comprender la estructura, la firma y las vulnerabilidades comunes es esencial para desarrolladores full-stack. El decodificador JWT de ToolsKu le ayuda a depurar la autenticación rápidamente—pero recuerde: decodificar no es verificar; siempre valide firmas en el servidor en producción.