¿Qué es JWT (JSON Web Token)?

JWT (JSON Web Token) es un estándar abierto para transmitir claims entre partes como un objeto JSON compacto y firmado. Aprende cómo funciona JWT, su estructura de tres partes, cuándo usarlo y las mejores prácticas de seguridad.

¿Qué es JWT (JSON Web Token)? Autenticación Stateless Explicada

JWT es un estándar abierto para transmitir claims entre partes como un objeto JSON compacto y firmado — la base de la autenticación stateless en APIs, microservicios y sistemas de single sign-on.


Resumen JWT (JSON Web Token) es un estándar abierto (RFC 7519) que codifica claims — afirmaciones sobre un usuario o entidad — en una cadena compacta y URL-safe que puede ser firmada criptográficamente y verificada. Un JWT tiene tres partes: header, payload y signature. Cuando un usuario se autentica, el servidor emite un JWT que el cliente envía con cada solicitud posterior. El servidor verifica la firma sin consultar una base de datos, habilitando la autenticación stateless. Los access tokens JWT deben expirar en 5–60 minutos. Los refresh tokens gestionan las sesiones de larga duración.


¿Qué es JWT?

JWT (JSON Web Token) es un estándar abierto (RFC 7519) para transmitir información de forma segura entre partes como un objeto JSON compacto y URL-safe. Un JWT codifica claims — afirmaciones sobre una entidad (típicamente un usuario) — y está firmado criptográficamente para que el receptor pueda verificar su autenticidad e integridad sin contactar al emisor.

JWT resuelve un problema específico: cómo pasar información de identidad verificada entre servicios en un sistema stateless sin almacenar datos de sesión en el servidor.


Cómo funciona JWT

  1. El usuario se autentica — El cliente envía credenciales (usuario + contraseña) al servidor de autenticación.
  2. El servidor emite el JWT — El servidor valida las credenciales, crea un JWT con las claims del usuario (ID de usuario, roles, expiración), lo firma con un secreto o clave privada y lo devuelve.
  3. El cliente almacena y envía el JWT — El cliente guarda el JWT (típicamente en una cookie HttpOnly o en memoria) y lo envía en el header Authorization: Bearer <token> con cada solicitud.
  4. El servidor verifica el JWT — El servidor comprueba la firma, valida la expiración y las claims, y procesa la solicitud — sin necesidad de consultar la base de datos.

Este flujo es stateless: el servidor no mantiene datos de sesión. Cualquier instancia de servidor que conozca la clave de firma puede verificar el token.


Estructura de JWT: tres partes

Un JWT está formado por tres segmentos codificados en Base64URL separados por puntos: header.payload.signature

{
"alg": "HS256",
"typ": "JWT"
}

Especifica el algoritmo de firma (HS256, RS256, ES256) y el tipo de token. Codificado en Base64URL.

Payload

{
"sub": "user_123",
"name": "María García",
"role": "admin",
"iat": 1712345678,
"exp": 1712349278
}

Contiene las claims. Claims registradas (definidas por RFC 7519):

ClaimNombreDescripción
subSubjectIdentificador único de la entidad (ID de usuario)
issIssuerServicio que emitió el token
audAudienceDestinatario(s) previsto(s) del token
expExpirationTimestamp Unix después del cual el token es inválido
iatIssued AtTimestamp Unix de cuándo se creó el token
nbfNot BeforeTimestamp Unix antes del cual el token es inválido

Los payloads JWT están codificados en Base64URL, no cifrados. Cualquier persona que intercepte un JWT puede decodificar y leer el payload. Nunca almacenes contraseñas, números de tarjeta de crédito ni datos personales (PII) en las claims JWT.

Signature

HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)

La firma garantiza que el token no ha sido manipulado. El servidor la verifica usando el mismo secreto (HMAC) o la clave pública del emisor (RSA/ECDSA).


Algoritmos de firma: HMAC vs RSA

AlgoritmoTipoClaveUsar cuando
HS256Simétrico (HMAC)Secreto compartidoServicio único; emisor y verificador comparten el secreto
RS256Asimétrico (RSA)Par de clave pública/privadaMúltiples servicios; el emisor firma con clave privada, cualquier servicio verifica con clave pública
ES256Asimétrico (ECDSA)Par de clave pública/privadaIgual que RS256, con claves más pequeñas y mejor rendimiento

Usa HS256 para autenticación simple en servicio único. Usa RS256 o ES256 cuando múltiples servicios independientes necesiten verificar tokens sin acceso al secreto de firma.


Access tokens vs refresh tokens

 Access tokenRefresh token
PropósitoAutoriza el acceso a la APIObtiene nuevos access tokens
Tiempo de vidaCorto: 5–60 minutosLargo: horas a semanas
Se envía conCada solicitud a la APISolo en el endpoint de renovación del token
AlmacenamientoMemoria o cookie HttpOnlyCookie HttpOnly segura
RevocableNo sin infraestructura adicionalSí, mediante base de datos de tokens

Los access tokens de corta duración limitan el daño en caso de robo del token. Los refresh tokens habilitan sesiones largas sin requerir que el usuario se autentique de nuevo.


JWT vs sesiones del lado del servidor

 JWTSesión del lado del servidor
EstadoStateless — sin almacenamiento en el servidorStateful — sesión almacenada en el servidor
EscalabilidadCualquier servidor verifica cualquier tokenRequiere sticky sessions o session store compartido
RevocaciónNo se puede revocar antes de expirar sin blacklistRevocación inmediata al eliminar la sesión
TamañoMayor (token en cada solicitud)Pequeño (solo session ID en cookie)
Mejor paraAPIs, microservicios, SSO, apps móvilesAplicaciones web que requieren cierre de sesión inmediato

Errores comunes de seguridad con JWT

ErrorRiesgoCorrección
Almacenar PII en el payloadCualquiera puede decodificar el payloadAlmacena solo claims no sensibles (ID de usuario, roles)
Access tokens de larga duración (horas/días)El robo del token tiene una larga ventana de exposiciónEstablece exp en 5–60 minutos
No validar la claim algAtaques de confusión de algoritmo (ej.: cambio RS256 → HS256)Siempre impone el algoritmo esperado en el servidor
Almacenar JWT en localStorageLos ataques XSS pueden robar el tokenUsa cookies HttpOnly, Secure, SameSite=Strict
Sin plan de revocación de tokenLos tokens comprometidos siguen siendo válidos hasta expirarImplementa expiración corta + rotación de refresh token
No validar iss y audSe aceptan tokens de otros serviciosSiempre valida las claims de emisor y audiencia

Cuándo usar JWT

Usa JWT cuando necesites:

  • Autenticación stateless para APIs REST o GraphQL
  • Single Sign-On (SSO) entre múltiples aplicaciones o dominios
  • Claims de autorización embebidas en el token (roles, ámbitos, permisos)
  • Apps móviles o SPAs que no pueden mantener sesiones del lado del servidor
  • Autenticación servicio a servicio en microservicios

No uses JWT cuando necesites:

  • Revocación inmediata de sesión (ej.: el cierre de sesión debe bloquear todas las solicitudes instantáneamente)
  • Registro en el servidor de cada acción del usuario con contexto de sesión
  • Tokens mayores de ~8KB (la sobrecarga de ancho de banda crece con cada solicitud)

Preguntas frecuentes

¿Qué es JWT en términos simples? JWT es un token que prueba quién eres y qué tienes permitido hacer. El servidor lo crea, lo firma criptográficamente y te lo entrega. Tú lo envías con cada solicitud. El servidor verifica la firma sin necesidad de consultarte en una base de datos.

¿Es JWT seguro? JWT es seguro cuando se usa correctamente. La firma previene la manipulación. Sin embargo, el payload solo está codificado en Base64 — no cifrado — por lo que cualquier persona que obtenga el token puede leer su contenido. Usa HTTPS para toda transmisión de tokens y nunca pongas datos sensibles en el payload.

¿Cuál es la diferencia entre JWT y OAuth? OAuth 2.0 es un framework de autorización que define cómo se emiten y usan los tokens. JWT es un formato de token. OAuth 2.0 comúnmente usa JWT como formato de access token, pero JWT puede usarse independientemente de OAuth.

¿Cómo invalido un JWT antes de que expire? Los JWTs no pueden invalidarse sin infraestructura adicional. Opciones: (1) usa tiempos de expiración cortos (5–15 minutos), (2) mantén una blacklist de tokens en un caché (Redis), (3) usa una claim de versión en el payload que se vuelve inválida cuando el usuario cambia su contraseña o cierra sesión.

¿Cuál es la diferencia entre HS256 y RS256? HS256 usa un secreto compartido único — tanto el emisor como cualquier verificador deben conocerlo. RS256 usa un par de claves pública/privada — el emisor firma con la clave privada, y cualquier verificador puede confirmar con la clave pública sin acceso al secreto. Usa RS256 cuando múltiples servicios independientes necesiten verificar tokens.

¿Debo almacenar el JWT en localStorage o en cookies? Almacena el JWT en cookies HttpOnly, Secure, SameSite=Strict. localStorage es accesible vía JavaScript y vulnerable a ataques XSS. Las cookies HttpOnly impiden completamente el acceso vía JavaScript. Las cookies requieren protección contra CSRF, pero este es un trade-off manejable.

¿Qué ocurre cuando un JWT expira? Cuando la claim exp de un JWT está en el pasado, el servidor lo rechaza con una respuesta 401 Unauthorized. El cliente debe usar un refresh token para obtener un nuevo access token, o solicitar al usuario que se autentique de nuevo.

¿Qué es una claim JWT? Una claim es una afirmación sobre el sujeto del token. Por ejemplo, "sub": "user_123" afirma que el sujeto del token es el usuario 123. "role": "admin" afirma que ese usuario es administrador. Las claims están definidas por RFC 7519 (claims registradas) o por la aplicación (claims privadas).

mantente actualizado

Suscríbete a nuestro boletín informativo

Recibe las últimas actualizaciones de productos, destacados de eventos y conocimientos de la industria tecnológica directamente en tu bandeja de entrada.