Token inválido
HS256
HEADER_NO_DATA
NO_DATA
Cómo funcionan los JSON Web Tokens, validación de estructura, verificación de firmas y mejores prácticas de seguridad
xxxxx.yyyyy.zzzzz). Cada parte tiene un propósito específico:| Parte | Propósito | Ejemplo de contenido | Codificación | Obligatorio |
|---|---|---|---|---|
| Cabecera (Header) | Especifica el tipo de token y algoritmo de firma | {"alg":"HS256","typ":"JWT"} | Base64Url | Sí |
| Payload (Cuerpo) | Contiene las declaraciones (claims) sobre el usuario | {"sub":"1234567890","name":"Juan Pérez","iat":1516239022} | Base64Url | Sí |
| Firma (Signature) | Verificación criptográfica de integridad | HMACSHA256(base64UrlEncode(cabecera) + "." + base64UrlEncode(payload), secreto) | Base64Url | Sí |
| Algoritmo | Tipo | Tamaño clave | Rendimiento | Nivel seguridad | Caso de uso | Estándar |
|---|---|---|---|---|---|---|
| HS256 / HS384 / HS512 | Simétrico (HMAC) | 256-512 bits | Más rápido (1.0x) | 128-256 bits | Servidor único, entorno confiable, APIs internas | RFC 7518 |
| RS256 / RS384 / RS512 | Asimétrico (RSA) | 2048-4096 bits | Medio (3-5x más lento) | 112-152 bits | Sistemas distribuidos, microservicios, clientes externos | RFC 7518 |
| ES256 / ES384 / ES512 | Asimétrico (ECDSA) | 256-512 bits | Rápido (1.2x) | 128-256 bits | Sistemas modernos, dispositivos con recursos limitados, IoT | RFC 7518 |
| PS256 / PS384 / PS512 | Asimétrico (RSA-PSS) | 2048-4096 bits | Medio-lento (4-6x) | 128-256 bits | Requisitos de seguridad más altos (a prueba de futuro) | RFC 7518 |
| none | Sin seguridad | N/A | Sin verificación | Ninguno | Solo desarrollo/testing (nunca en producción) | RFC 7519 |
| Claim | Nombre | Tipo | Descripción | ¿Obligatorio? | Validación |
|---|---|---|---|---|---|
| iss | Emisor (Issuer) | String/URI | Identifica quién emitió el JWT | Opcional | Verificar que coincide con el emisor esperado |
| sub | Sujeto (Subject) | String/URI | Identifica al sujeto del JWT (ID usuario, email) | Opcional | Usar para autorización |
| aud | Audiencia (Audience) | String/URI o array | Identifica los destinatarios del JWT | Opcional | Verificar que tu servicio está en la audiencia |
| exp | Expiración | NumericDate (segundos desde época) | Tiempo después del cual NO debe aceptarse el JWT | Recomendado | Rechazar si tiempo actual > exp |
| nbf | No antes de (Not Before) | NumericDate | Tiempo antes del cual NO debe aceptarse el JWT | Opcional | Rechazar si tiempo actual < nbf |
| iat | Emitido en (Issued At) | NumericDate | Momento en que se emitió el JWT | Recomendado | Opcional: rechazar si más antiguo que tolerancia |
| jti | ID del JWT | String | Identificador único del JWT (previene ataques de repetición) | Opcional | Verificar contra caché de tokens usados |
| Herramienta | Decodificado | Firma HS256 | Privacidad | Funciona offline | Procesado local | Riesgo de exposición del secreto |
|---|---|---|---|---|---|---|
| Nuestra herramienta (local) | 0.01s | 100% local | 0.03s | 100% local | ✅ Sin datos externos | ✅ Sí (funciona offline) | ✅ 100% frontend (Web Crypto API) | ❌ Ninguno (el secreto permanece en memoria del navegador) |
| jwt.io (online) | 0.05s + red | 0.05s + red | ❌ El código se carga del servidor | ❌ No (requiere internet) | ❌ No verificado | ⚠️ El secreto podría ser registrado |
| JWT Debugger (online) | 0.05s + red | 0.05s + red | ❌ Tokens enviados a servidores | ❌ No | ❌ No verificado | ⚠️ Tokens y secretos expuestos |
| Herramientas CLI (jq + openssl) | 0.01s | 0.02s | ✅ Local | ✅ Sí | ✅ 100% local | ❌ Ninguno (CLI maneja localmente) |
| Vulnerabilidad | CWE ID | Descripción | Impacto | Mitigación |
|---|---|---|---|---|
| Ataque alg=none | CWE-345 | Atacante cambia alg a 'none' para evitar verificación de firma | Bypass completo de autenticación | Nunca aceptar algoritmo 'none' en producción; validar algoritmo contra lista blanca |
| Confusión de claves (RS256 a HS256) | CWE-327 | Atacante cambia de RS256 a HS256 y usa clave pública como secreto simétrico | Tokens falsificados | Siempre verificar algoritmo; nunca mezclar tipos de clave; usar kid (ID de clave) para rotación |
| Secreto de firma débil (HS256) | CWE-326 | Usar secretos cortos o predecibles (ej. 'secreto', 'password123') | Falsificación de tokens por fuerza bruta | Usar secretos con >64 bits de entropía (aleatorio, >32 caracteres) |
| Sin expiración (exp ausente) | CWE-613 | Los tokens nunca expiran, pueden reutilizarse indefinidamente | Secuestro de sesión | Siempre establecer claim exp con vida útil razonable (15 min a 24 horas) |
| Exposición de información | CWE-200 | Almacenar datos sensibles en el payload del JWT | Fuga de datos | Nunca almacenar contraseñas, tarjetas de crédito o PII en JWT sin encriptar; usar JWE para datos confidenciales |
🔐
Cliente se autentica → servidor emite JWT → cliente envía cabecera Authorization: Bearer <token> en cada petición. Sin estado, escalable a millones de peticiones. Utilizado por Stripe, GitHub API, Spotify API y miles de microservicios.
👥
Usuarios se autentican una vez, reciben un JWT y acceden a múltiples aplicaciones sin reautenticarse. OpenID Connect (OIDC) construye sobre JWT para la capa de identidad. Utilizado por Google, Microsoft Azure AD, Okta, Auth0.
🔄
Servicio interno A emite JWT → servicio B valida firma con clave pública → sin base de datos central. Ideal para arquitecturas de confianza cero (zero-trust). Utilizado por Kubernetes, Docker y mallas de servicios (Istio, Linkerd).
📱
Apps nativas iOS/Android se autentican contra backend → JWT almacenado de forma segura (Keychain/Keystore) → incluido en cada llamada API. Validación offline posible si la clave pública está cacheadA. Soporta millones de usuarios concurrentes.
JWT (JSON Web Token) es el formato contenedor. JWS (JSON Web Signature) es un JWT firmado — el tipo más común (HMAC/RSA/ECDSA). JWE (JSON Web Encryption) es un JWT encriptado, donde el payload está encriptado para confidencialidad. La mayoría de las APIs usan JWS (firmados, no encriptados). Nuestra herramienta maneja JWS (tokens firmados).
Los JWT son sin estado, por lo que no hay un mecanismo de revocación incorporado. Enfoques comunes: (1) Mantener una lista negra (denylist) de IDs de token revocados (claim jti) en una caché rápida (Redis). (2) Usar tiempos de expiración cortos (5-15 min) más tokens de actualización (refresh tokens). (3) Cambiar la contraseña del usuario o rotar las claves de firma. Para aplicaciones de alta seguridad, mantener una base de datos de sesiones, negando la ventaja de stateless.
Recomendado: cookies httpOnly seguras (previene XSS, pero vulnerable a CSRF — usar SameSite=Strict). No recomendado: localStorage (vulnerable a XSS; cualquier script puede leer tokens). Para SPAs sin renderizado del lado del servidor, usar memoria (estado de React/Vuex) con renovación silenciosa. Nuestra herramienta es para depuración/desarrollo, no para gestión de tokens en producción.
Sí, pero con matices. El tamaño del JWT crece con los claims (puede superar el límite de cookie del navegador de 4KB). La rotación de tokens de actualización es compleja. Muchos recomiendan cookies de sesión tradicionales para aplicaciones de navegador y JWT para comunicación API-to-API. Evalúa tu modelo de amenazas: JWT es excelente para sistemas distribuidos/sin estado, las sesiones son más simples para aplicaciones monolíticas sin clientes móviles.
Idealmente menos de 1KB (cabe en cabeceras HTTP sin fragmentación). Cada claim añade tamaño. Un JWT típico con 5-8 claims ocupa 200-400 bytes. JWT grandes (>8KB) causan problemas con límites de tamaño de cabeceras HTTP (8KB en muchos servidores). Si necesitas más datos, considera tokens de referencia (almacenar datos en el servidor, pasar un identificador opaco).
Sí, si el secreto es fuerte (≥256 bits, generado aleatoriamente, almacenado en un gestor de secretos) y la red interna es confiable. HS256 es más rápido que RSA/ECDSA y más simple. Para entornos de confianza cero o clientes externos, usar RS256/ES256 para que la clave privada nunca abandone el servidor de autenticación. Nunca hardcodees secretos en el código fuente.
✅
✅ Servidor de autenticación único ✅ Red interna confiable ✅ Necesitas máximo rendimiento (baja latencia) ✅ Gestión de claves simple (secreto compartido) ✅ No hay validación de tokens por terceros
✅
✅ Múltiples microservicios validan tokens ✅ Clientes externos necesitan clave pública ✅ Arquitectura de confianza cero ✅ Necesitas rotación de claves sin tiempo de inactividad ✅ El cumplimiento requiere almacenamiento separado de clave privada
❌
❌ NUNCA en producción ❌ Solo para pruebas locales ❌ Deshabilítalo en tu librería JWT ❌ CVE-2015-9235 (vulnerabilidad alg=none)
JWT es una herramienta poderosa para la autenticación moderna, pero con poder viene responsabilidad. Las vulnerabilidades más comunes no están en la especificación JWT — están en implementaciones defectuosas: secretos débiles, ataques de confusión de algoritmos, falta de validación de expiración, y confiar en los tokens antes de verificar la firma. Prueba, audita, valida. La seguridad es un proceso, no un producto.
— Basado en: RFC 7519 (JWT), RFC 7518 (JWA), NIST SP 800-57 (Gestión de Claves), OWASP JWT Cheatsheet (2025), CWE Top 25 (2025)Completamente gratuito
Sin registro
Sin servidores externos
Tu seguridad es nuestra prioridad
Procesamiento 100% local
Comentarios
Inicia sesión para dejar un comentario
🔒 Procesamiento 100% local · ningún token sale de tu navegador