28-JWT en 10 minutos - ¿Qué es JWT? ¿Para que sirve? ¿Cuando usarlo? ¿Cómo se usa?

  https://www.youtube.com/watch?v=tWQobKFQLG0

Tutorial de JWT (JSON Web Tokens)

¿Qué es un JWT?

JWT significa JSON Web Token. Es un estándar abierto que permite definir de manera compacta y autocontenida cómo transmitir información entre distintas aplicaciones o entidades utilizando objetos JSON.

Características clave:

  • Información verificable: El contenido del token está firmado digitalmente

  • Puede usar diferentes métodos de firma:

    • Secreto compartido (solo cliente y servidor lo conocen)

    • Clave pública/privada

  • Formato estándar: Compacto y fácil de transmitir

Caso de uso principal: Autorización

El uso más común de JWTs es para autorización, donde un usuario incluye el token en cada solicitud a una API para identificarse y demostrar qué acceso tiene.

Comparación: Autenticación tradicional vs JWT

Autenticación basada en sesiones (tradicional)

  1. Usuario envía credenciales (login)

  2. Servidor crea sesión y la almacena

  3. Servidor devuelve cookie con session ID

  4. Cliente incluye cookie en cada request

  5. Servidor verifica la sesión almacenada

Problema: En arquitecturas de microservicios, cada servicio necesita su propia autenticación.

Autenticación con JWT

  1. Usuario envía credenciales

  2. Servidor crea JWT (no almacena nada)

  3. Servidor devuelve JWT al cliente

  4. Cliente incluye JWT en cada request

  5. Servidor valida la firma del JWT

Ventajas:

  • El servidor no almacena estado

  • Funciona perfectamente con microservicios

  • El token contiene toda la información necesaria

Estructura de un JWT

Un JWT tiene tres partes separadas por puntos:

text
aaaaa.bbbbb.ccccc

1. Header (Encabezado)

Contiene:

  • typ: Tipo de token (JWT)

  • alg: Algoritmo de firma (HS256, RS256, etc.)

Ejemplo (decodificado):

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

2. Payload (Carga útil)

Contiene los "claims" (afirmaciones) - información sobre la entidad.

Hay tres tipos de claims:

  • Registrados: Recomendados pero no obligatorios

    • sub (subject): A quién se refiere el token

    • exp (expiration): Tiempo de expiración

    • iss (issuer): Quién emitió el token

    • aud (audience): Para quién es el token

  • Públicos: Definidos por los usuarios

  • Privados: Información personalizada de la aplicación

Ejemplo (decodificado):

json
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}

3. Signature (Firma)

Se crea usando:

  • Header codificado

  • Payload codificado

  • Secreto

  • Algoritmo especificado en el header

Ejemplo práctico

Veamos un JWT real:

text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Puedes inspeccionarlo en jwt.io

Flujo típico de autorización con JWT

  1. Cliente solicita autorización al servidor de autenticación

  2. Servidor valida credenciales y genera JWT

  3. Servidor devuelve JWT al cliente

  4. Cliente incluye JWT en header de requests subsiguientes:

    text
    Authorization: Bearer <token>
  5. Servidor verifica firma del JWT en cada request

  6. Servidor responde según los permisos del usuario

Implementación práctica

Instalación (Node.js)

bash
npm install jsonwebtoken

Crear un token

javascript
const jwt = require('jsonwebtoken');

const payload = {
  userId: 123,
  username: 'johndoe',
  roles: ['user', 'admin']
};

const secret = 'mi-secreto-super-seguro'; // En producción, usa variable de entorno
const token = jwt.sign(payload, secret, { expiresIn: '1h' });

console.log('Token:', token);

Verificar un token

javascript
try {
  const decoded = jwt.verify(token, secret);
  console.log('Datos decodificados:', decoded);
} catch (error) {
  console.error('Token inválido:', error.message);
}

Mejores prácticas

  1. Usar expiration time: Siempre establece tiempo de expiración

  2. Almacenar seguro: Guarda JWTs en HTTP-only cookies o localStorage seguro

  3. Secretos seguros: Usa secretos complejos y guárdalos en variables de entorno

  4. HTTPS: Siempre usa HTTPS en producción

  5. Validar siempre: Verifica el token en cada request protegido

Conclusión

Los JWTs son una solución moderna y eficiente para autenticación y autorización en aplicaciones web y APIs. Su naturaleza stateless los hace ideales para arquitecturas distribuidas y microservicios.

¿Te gustaría que profundice en algún aspecto específico de JWT? ¡Déjamelo saber en los comentarios!

Comentarios

Entradas más populares de este blog

1-Autenticación JWT en PHP: Explicación y Ejemplo

8-JWT en 10 minutos - ¿Qué es JWT? ¿Para que sirve? ¿Cuando usarlo? ¿Cómo se usa?

2-JSON Web Tokens