jsonwebtoken expiration example access-token jwt express-jwt json-web-token

access token - expiration - JSON Token web(JWT) se beneficia de un token de sesión de base de datos



jwt generator (2)

Con un sistema de token de sesión de base de datos podría tener un inicio de sesión de usuario con un nombre de usuario / contraseña, el servidor podría generar un token (un uuid por ejemplo) y almacenarlo en la base de datos y devolver ese token al cliente. Cada solicitud de allí incluiría el token y el servidor buscaría si el token es válido y a qué usuario pertenece.

Usando JWT no habría necesidad de guardar nada en la base de datos con respecto a la sesión / tokens gracias a la combinación de la clave secreta guardada en el servidor y el token firmado que el cliente guarda y envía con cada solicitud.

Esto es bueno, pero además de guardar una base de datos, verifique cada solicitud (que sería rápida de todos modos, ya que solo está revisando una tabla hash), no tengo claro cuáles son las ventajas de usar JWT. ¿Puede alguien familiarizado con esto explicar? Vamos a ignorar las cookies, es específicamente un token personalizado de base de datos como se describe anteriormente y JWT que estoy tratando de comparar y comprender los beneficios .


La principal diferencia es el tamaño de almacenamiento de la sesión y el trabajo de búsqueda requerido desde el servidor:

  • En el lado del servidor, JWT almacena una sola clave en la memoria (o en el archivo de configuración), llamada clave secreta . Esa clave tiene dos propósitos, permite crear nuevos tokens encriptados y también funciona como una llave maestra que "abre todos los bloqueos", o en la vida real verifica todos los tokens. Como resultado, el servidor responde mucho más rápido a las solicitudes de autenticación, ya que no importa si tiene dos o dos millones de usuarios conectados; se usará la misma cantidad de registros (uno, esa clave de servidor) para autenticar todas las solicitudes de los clientes.

  • La autenticación tradicional que almacena sesiones de usuario en una base de datos, crea un registro en el archivo db para cada usuario individual, lo que da como resultado varias claves . Entonces, si tiene dos millones de usuarios conectados, el servidor creará dos millones de registros y, con cada solicitud de cliente, el servidor necesita ubicar el registro de sesión relevante en la base de datos *.

JWT lo deja en el lado del cliente para almacenar y manejar toda la sesión / objeto de usuario. En realidad, tiene mucho más sentido porque cada cliente maneja solo sus propios datos, por lo que tampoco causa un gran esfuerzo para el lado del cliente.

En cuanto a lo que escribió en su último párrafo, no son solo las llamadas a DB las que guardamos aquí. JWT es en realidad mucho más escalable debido a su naturaleza independiente y liviana, no falla a medida que las solicitudes de autenticación se acumulan y permite que el servidor maneje la autenticación en dispositivos y servicios sin administrar sesiones en el servidor.

Sin embargo, en términos de seguridad, las sesiones de db podrían tener la ventaja: pueden ser más seguras debido a esa latencia, y también son menos vulnerables al secuestro de sesión después del cierre de sesión del usuario.

* El método de sesiones almacenadas de db se puede optimizar con el almacenamiento en caché efectivo y almacenando solo el ID de la sesión (a diferencia de todo el objeto de usuario) en un servidor de clave / valor rápido como Redis. Dicho esto, aún elegiría el método JWT sobre db en la mayoría de los casos.


Un token basado en Json (JWT) supera los siguientes problemas:

  1. Problemas con dispositivos móviles: las aplicaciones móviles nativas parecen tener problemas para trabajar con cookies, por lo que si necesitamos consultar una API remota, quizás la autenticación de sesión no sea la mejor solución.
  2. Problemas de CSRF: si sigue las cookies, debe tener CSRF para evitar las solicitudes entre sitios.

Pero JWT no usa sesiones, no tiene problemas con los dispositivos móviles, no necesita CSRF y también funciona muy bien con CORS. Si no tienes un token válido, no puedes hacer nada.

Una más, ya que este token se almacena en el almacenamiento local / almacenamiento de la sesión del cliente para que pueda pasar estos tokens a otros clientes también, pero debe compartir la misma credencial que utilizó para generar este JWT.