RFC 7519

Estándares Y Rfcs Security Notes Jan 6, 2025 JAVASCRIPT

Definicion

¿Cómo demuestras quién eres en internet sin estar constantemente pidiendo a los usuarios que vuelvan a introducir sus contraseñas? RFC 7519 define los JSON Web Tokens (JWTs), una solución ingeniosa que se ha convertido en la columna vertebral de la autenticación web moderna. En lugar de consultar una base de datos en cada petición, los servidores pueden emitir tokens autocontenidos que llevan toda la prueba de identidad dentro de sí mismos.

Un JWT es esencialmente un objeto JSON firmado que se codifica en base64 como una cadena compacta. Parece una cadena de caracteres aleatorios separada por dos puntos: xxxxx.yyyyy.zzzzz. Pero esa cadena de aspecto aleatorio en realidad contiene tres partes: un header (que te dice qué algoritmo se usó para firmarlo), un payload (que contiene los claims reales sobre el usuario), y una firma (que prueba que el token no ha sido manipulado).

La magia de los JWTs está en esa firma. Cuando un servidor crea un JWT, lo firma con una clave secreta. Después, cuando ese JWT vuelve con una petición, el servidor puede verificar la firma matemáticamente - sin consultar ninguna base de datos. Si alguien intenta modificar el JWT (cambiar el ID de usuario, extender la expiración, o darse privilegios de admin), la firma no coincidirá, y el servidor lo rechazará. Es como un sello a prueba de manipulaciones que no se puede falsificar.

Ejemplo

Mantener la sesión iniciada en sitios web: Cuando inicias sesión en una aplicación web, el servidor crea un JWT conteniendo tu ID de usuario, roles y tiempo de expiración. Tu navegador almacena este token y lo incluye con cada petición. El servidor valida la firma para confirmar que eres quien dices ser - sin necesidad de consulta a base de datos.

Autenticación en apps móviles: Cuando inicias sesión en una app de banca móvil, recibes un JWT. Durante los próximos 30 minutos, cada toque que requiera comunicación con el servidor envía ese JWT. El servidor confía en él porque solo los servidores del banco pueden crear tokens válidamente firmados.

Single Sign-On (SSO): Cuando usas “Iniciar sesión con Google” en múltiples sitios web, Google emite JWTs que esos sitios web pueden verificar independientemente. Cada sitio confía en la firma de Google, así que saben que el token genuinamente vino de Google.

Comunicación entre microservicios: En sistemas grandes con docenas de servicios, los JWTs permiten a los servicios confiar entre sí. Cuando el servicio de pedidos llama al servicio de inventario, presenta un JWT. El servicio de inventario verifica la firma sin necesidad de llamar a un servidor de autenticación central.

Analogia

La Tarjeta de Identificación a Prueba de Manipulaciones: Imagina una tarjeta de identificación que contiene tu foto, nombre, departamento y permisos de acceso - pero impresa en tinta especial que cambia de color si alguien intenta modificarla. Eso es un JWT. Toda la información es visible (base64 no es encriptación), pero cualquier manipulación es inmediatamente detectable.

La Carta Sellada con Cera: En tiempos medievales, las cartas importantes se sellaban con cera estampada con un anillo de sello. Cualquiera podía leer la carta, pero el sello intacto probaba que venía de la persona correcta y no había sido manipulada. Los JWTs son la versión digital de este sello de cera.

La Tarjeta de Embarque: Tu tarjeta de embarque contiene tu nombre, vuelo, asiento y hora de embarque. La aerolínea puede verificar que es genuina comprobando el código de barras - no necesitan buscarte en una base de datos. Si alguien photoshopeara un nombre o número de asiento diferente, el código de barras no coincidiría.

El Documento Notarizado: Un documento notarizado lleva toda la información que cualquiera necesita, más el sello de un notario probando que es auténtico. Los JWTs funcionan de manera similar - llevan todos los claims necesarios, más un “sello” criptográfico probando que son genuinos.

Code Example


// Estructura JWT: header.payload.signature
// Header (algoritmo y tipo)
{
  "alg": "HS256",
  "typ": "JWT"
}

// Payload (claims)
{
  "sub": "1234567890",
  "name": "Juan García",
  "iat": 1516239022,
  "exp": 1516242622,
  "roles": ["admin"]
}

// Creando un JWT (Node.js)
const jwt = require('jsonwebtoken');
const token = jwt.sign(
  {
    sub: user.id,
    name: user.name,
    roles: user.roles
  },
  SECRET_KEY,
  { expiresIn: '1h' }
);

// Verificando un JWT
try {
  const decoded = jwt.verify(token, SECRET_KEY);
  console.log(decoded.name); // "Juan García"
} catch (err) {
  console.error('Token inválido');
}

// Uso en peticiones HTTP
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Notas de Seguridad

SECURITY NOTES

Requisitos Principales:

  • Verifica siempre la firma del JWT antes de confiar en los claims.
  • Usa secretos fuertes (256+ bits) para HS256 o claves asimétricas (RS256) para sistemas distribuidos.
  • Establece tiempos de expiración cortos (claim exp).
  • Nunca almacenes datos sensibles en el payload del JWT - está codificado en base64, no encriptado.

Mejores Prácticas:

  • Valida los claims de issuer (iss), audience (aud) y expiration (exp).
  • Usa HTTPS exclusivamente.
  • Implementa revocación de tokens para logout.
  • Considera usar refresh tokens para sesiones de larga duración.
  • Cuidado con ataques de confusión de algoritmo - especifica explícitamente el algoritmo esperado..