Guía Completa de Seguridad JWT: Decodificación, Verificación y Vulnerabilidades Comunes

Utilidades

¿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

  1. Abra el Decodificador JWT
  2. Pegue la cadena JWT
  3. Vea el Header y Payload JSON decodificados
  4. 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
  • exp no ha expirado
  • nbf está en vigor
  • iss es el emisor esperado
  • aud incluye el servicio actual
  • alg está en la lista blanca

Depuración de Problemas JWT

  1. Decodificar JWT: Use el Decodificador JWT para inspeccionar Header y Payload
  2. Verificar exp: ¿El token ha expirado?
  3. Verificar alg: ¿El algoritmo de firma coincide con lo esperado?
  4. Verificar iss/aud: ¿Son correctos el emisor y la audiencia?
  5. Verificar firma: Use el Generador JWT para volver a firmar con el mismo secreto y comparar
  6. Verificar transporte: ¿El header Authorization es Bearer <token>?

Herramientas Relacionadas


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.

#JWT#认证#安全#OAuth#API