Buenas prácticas y riesgos de los JSON Web Tokens (JWT)

Clase 22 de 25Curso de OAuth 2.0 y OpenID Connect: Flujos de Autenticación y Casos de Estudio

Contenido del curso

Open Authorization 2.0

Resumen

Saber cuándo y cómo usar JSON Web Tokens marca la diferencia entre una aplicación segura y una vulnerable. Antes de lanzar a producción cualquier sistema basado en OAuth u OpenID Connect, es fundamental conocer las limitaciones de los JWT, las preocupaciones reales de seguridad y las estrategias para mitigarlas.

¿Cuándo no deberías usar JSON Web Tokens?

Existen escenarios donde los JWT dejan de ser la mejor opción. Si alguna de las siguientes buenas prácticas no se puede cumplir, lo más prudente es considerar alternativas como las sesiones tradicionales [01:14]:

  • Evitar información sensible en el payload: los JWT se pueden decodificar sin necesidad de la llave secreta. Cualquier dato como números de teléfono, identificaciones, contraseñas o tarjetas de crédito queda expuesto. Esto también puede violar regulaciones como el GDPR [01:32].
  • Mantener el payload liviano: a mayor cantidad de datos, más pesado el token. Las cookies tienen límites de tamaño y las URLs también, por lo que abusar del contenido genera problemas de almacenamiento y transporte [02:08].
  • Usar un tiempo de expiración corto: si un access token se filtra, cualquiera puede usarlo sin necesidad de comunicación adicional con el servidor. La recomendación es un máximo de quince minutos [02:27].
  • Tratar los JWT como tokens opacos: aunque técnicamente se pueden decodificar del lado del cliente, no es seguro hacerlo allí. La verificación de la firma siempre debe ocurrir en el backend, porque el cliente se puede modificar y nada garantiza la integridad de la validación [02:48].

Cuando alguna de estas prácticas se rompe, usar JSON Web Tokens se convierte en un riesgo de seguridad real para tu aplicación [03:24].

¿Cómo resolver las preocupaciones de seguridad con JWT?

Más allá de las buenas prácticas, existen preocupaciones concretas que requieren soluciones técnicas específicas.

¿Dónde almacenar los tokens de forma segura?

Uno de los errores más comunes es guardar los JWT en el local storage, lo que expone el token a vectores de ataque como librerías de terceros maliciosas [03:40]. La forma más efectiva es usar una cookie segura del lado del servidor. Esta cookie solo debe existir dentro del dominio y solo otro backend puede acceder al token [04:08].

Para las single-page apps (SPA), esto funciona siempre que todo el sistema pertenezca al mismo dominio. Si la SPA no comparte dominio con el servidor, la alternativa es almacenar el token en memoria: un state de React o una variable de JavaScript [04:32]. Al perder la referencia, simplemente se inicia sesión de nuevo.

¿Qué hacer si un token se filtra?

Si un token comprometido tiene un tiempo de expiración lo suficientemente largo para causar daño, se necesitan dos acciones [04:58]:

  • Asegurar que el token incluya el claim JTI (JSON Token Identifier), un identificador único que permite rastrear el token filtrado.
  • Implementar una block list o deny list donde se registren los tokens invalidados. Esto requiere desarrollo adicional en el backend.

¿Cómo manejar tokens expirados?

Cuando un token expira, hay dos caminos [05:32]:

  • Escuchar el error y redirigir al usuario al inicio de sesión con un mensaje claro.
  • Implementar tecnologías como refresh token o silent authentication. Es importante consultar la documentación de tu authorization server para verificar qué mecanismos soporta.

¿Qué pasa si las llaves de firmado se filtran?

En caso de una filtración de llaves criptográficas, se deben ejecutar dos acciones simultáneamente [06:03]:

  • Agregar al blocklist todos los tokens generados durante el período comprometido.
  • Contar con un mecanismo de rotación de llaves implementado previamente, lo que implica un desarrollo específico en tu aplicación.

¿Vale la pena el esfuerzo de implementar JWT?

Las preocupaciones con los JSON Web Tokens tienen solución, aunque implican desarrollo adicional. Muchas personas prefieren sesiones tradicionales porque ya traen estas protecciones integradas [06:24]. Sin embargo, los beneficios de los JWT, como la escalabilidad y la independencia del servidor, hacen que valga la pena invertir en su correcta implementación.

Comparte en los comentarios un ejemplo hipotético de cuándo es indispensable usar un JSON Web Token y cuándo sería mejor evitarlo.