jsonwebtoken

img

¿Qué es jsonwebtoken??

jsonwebtoken (JWT) es una librería que implementa el estándar JSON Web Token.
Un JWT es un formato de token seguro, compacto y auto-contenido, que permite transmitir información entre partes de forma confiable.

Se diferencia de otras soluciones como cookies de sesión o tokens opacos porque:

1. ¿Para qué se usa??

Se usa principalmente para autenticación y autorización.

Los contextos más comunes son:

2. ¿Qué puedo construir con jsonwebtoken??

Con JWT puedes construir:

3. ¿Cuándo es más conveniente usarlo??

Es conveniente usar JWT cuando:

En cambio, para aplicaciones pequeñas y simples, donde el manejo de sesiones no es un problema, podría ser mejor usar cookies de sesión.

Buenas prácticas recomendadas?


Resumen rápido

✅ Fortalezas principales:

⚠️ Debilidades principales:

🛠️ Cuándo usarlo:

🚫 Cuándo evitarlo:


Temas


Conceptos relacionados

Antes de trabajar con jsonwebtoken (JWT), conviene entender los siguientes conceptos:

JWT (JSON Web Token):

Un estándar abierto (RFC 7519) que define un formato compacto y seguro para transmitir información entre partes.

Header (Encabezado):

Contiene el algoritmo de firma (ejemplo: HS256, RS256) y el tipo de token (JWT).

Payload (Cuerpo o claims):

Datos que el token transporta, como userId, role, exp (expiración), entre otros.
Importante: no almacenar información sensible aquí.

Signature (Firma):

Se genera a partir del header, payload y una clave secreta/privada.
Sirve para verificar que el token no fue manipulado.

Claims:

Son las declaraciones dentro del payload.

Token stateless:

JWT es un mecanismo sin estado; no requiere guardar sesiones en el servidor.

Secret o Private Key:

Clave usada para firmar y verificar el token. Puede ser simétrica (HS256) o asimétrica (RS256).

Expiración (exp):

Tiempo límite de validez del token. Control esencial para la seguridad.

🔼 temas


Herramientas recomendadas

Para trabajar con JWT de forma más eficiente y segura, se recomienda:

Librerías principales:

Utilidades de depuración:

Gestión de claves y secretos:

Buenas prácticas en integración:

// Ejemplo de middleware Express para validar JWT
const jwt = require("jsonwebtoken");

function authMiddleware(req, res, next) {
  const token = req.headers["authorization"]?.split(" ")[1];
  if (!token) return res.status(401).json({ error: "Token requerido" });

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded; // Se adjunta info del usuario al request
    next();
  } catch (err) {
    return res.status(403).json({ error: "Token inválido o expirado" });
  }
}

module.exports = authMiddleware;

🔼 temas


Snippets rápidos

Fragmentos de código comunes que se reutilizan con frecuencia:

Generar un token con expiración

const token = jwt.sign({ userId: 1 }, process.env.JWT_SECRET, {
  expiresIn: "1h",
});

Verificar y decodificar un token

const decoded = jwt.verify(token, process.env.JWT_SECRET);

Decodificar un token sin verificar la firma (útil solo para debug)

const payload = jwt.decode(token);

Middleware típico en Express

app.use((req, res, next) => {
  const token = req.headers.authorization?.split(" ")[1];
  if (!token) return res.status(401).send("Token requerido");

  try {
    req.user = jwt.verify(token, process.env.JWT_SECRET);
    next();
  } catch {
    res.status(403).send("Token inválido o expirado");
  }
});

🔼 temas


Comandos

1. Generar un token

jwt.sign(payload, secretOrPrivateKey, [options, callback]);

Ejemplo:

const token = jwt.sign({ id: 10 }, "mi_secreto", { expiresIn: "2h" });

2. Verificar un token

jwt.verify(token, secretOrPublicKey, [options, callback]);

Ejemplo:

try {
  const decoded = jwt.verify(token, "mi_secreto");
  console.log(decoded);
} catch (err) {
  console.error("Token inválido");
}

3. Decodificar un token (sin validar firma)

jwt.decode(token, [options]);

Ejemplo:

const data = jwt.decode(token);
console.log(data); // Solo payload, no verifica seguridad

4. Opciones más comunes en sign

Ejemplo:

const token = jwt.sign({ role: "admin" }, "mi_secreto", {
  expiresIn: "30m",
  issuer: "miApp",
});

🔼 temas


Conceptos Claves

🟢 Básico

1. ¿Qué es un JSON Web Token (JWT)?

Un JWT es un estándar abierto (RFC 7519) que define un formato compacto y auto-contenido para transmitir información de forma segura entre partes, usando una firma digital.

2. ¿Cuáles son las tres partes principales de un JWT?

3. ¿Qué diferencia existe entre jwt.decode() y jwt.verify()?

4. ¿Qué es un claim en JWT?

Un claim es un dato dentro del payload. Puede ser:

5. ¿Cómo se genera un token en Node.js usando jsonwebtoken?

const jwt = require("jsonwebtoken");
const token = jwt.sign({ userId: 1 }, "mi_secreto", { expiresIn: "1h" });

🟡 Intermedio

6. ¿Cuál es la diferencia entre algoritmos de firma simétrica y asimétrica en JWT?

7. ¿Qué sucede si un token expira?

El método jwt.verify() lanza un error (TokenExpiredError) y el servidor debe pedir al cliente que renueve el token (normalmente mediante un refresh token).

8. ¿Dónde se recomienda almacenar un JWT en una aplicación web?

9. ¿Cómo invalidar un JWT antes de su expiración?

JWT por sí mismo es stateless, no puede invalidarse. Para hacerlo se necesita:

10. ¿Qué es el expiresIn y por qué es importante?

Es la duración de validez del token. Importante porque:


🔴 Avanzado

11. ¿Qué ventajas ofrece JWT frente a las sesiones tradicionales en servidor?

12. ¿Qué problemas de seguridad pueden ocurrir si guardas datos sensibles en el payload de un JWT?

El payload no está cifrado, solo codificado en Base64.
Cualquiera que tenga el token puede leerlo, por lo tanto no deben incluirse contraseñas, tarjetas o datos privados.

13. ¿Qué es el ataque “alg=none” en JWT?

Es una vulnerabilidad donde un atacante manipula el header para establecer alg: none, logrando que el servidor acepte el token sin validación de firma.

Solución: configurar librerías para aceptar solo algoritmos seguros (HS256, RS256).

14. ¿Cómo se maneja la autorización basada en roles con JWT?

Ejemplo:

if (req.user.role !== "admin") return res.status(403).send("Acceso denegado");

15. ¿Qué son los Refresh Tokens y por qué se usan con JWT?

Un refresh token es un token de larga duración que sirve para obtener nuevos JWT de acceso sin que el usuario deba loguearse otra vez.
Se usan porque los JWT de acceso deben tener corta expiración por seguridad, y el refresh token permite renovar sin perder usabilidad.

🔼 temas