example ejemplo spring rest security oauth-2.0 jwt

ejemplo - spring security rest token authentication



¿Tiene sentido almacenar JWT en una base de datos? (2)

Implementé un sistema de autenticación básico con Spring Boot, Spring Security, OAUTH2 y JWT como tokens de autenticación. Funciona bien, pero estaba pensando si tiene sentido almacenar JWT en una base de datos y verificar si existe un token cada vez que alguien hace una solicitud autenticada al usarlo. Estaba pensando específicamente en la siguiente situación: el usuario se autentica en un dispositivo móvil y lo pierde, por lo que quiere desautorizar ese dispositivo. Luego, podrían emitir una operación que borre los tokens emitidos a su identificación de usuario y desautoricen todos los tokens que se le asignaron. ¿Cualquier otra manera? ¿Estoy pensando en estas cosas incorrectas o complicadas?

Esto es para asegurar una API REST que se llamará desde una aplicación móvil.


Puede establecer la fecha de vencimiento (para dispositivos móviles de 1 semana). Agregue un campo personalizado refreshId para el usuario (puede usar uuid para esto). Siguiente conjunto Emitido en el parámetro de reclamaciones ("iat"). Almacene refreshId en db y refreshId como parámetro de reclamos. Luego, cada vez que valide un token, debe verificar la "edad" del token. Si es anterior a una hora, debe cargar datos de DB y comprobar el valor de refreshId y crear un nuevo token con el valor "iat" actual y enviarlo al dispositivo móvil. Cuando necesite desactivar tokens solo genere un nuevo valor para refreshId en db. Después de una hora, todos los tokens serán incorrectos, por lo que el usuario deberá iniciar sesión nuevamente en cada dispositivo. Puede hacer una solución más personalizada si lo necesita.


Puede almacenar el JWT en el db, pero puede perder algunos de los beneficios de un JWT. El JWT le da la ventaja de no tener que verificar el token en una base de datos todo el tiempo, ya que solo puede usar la criptografía para verificar que el token sea legítimo. Si tiene que buscar el token en el archivo db, también puede usar un token opaco que no contenga información y dejar que el servidor y la base de datos le proporcionen la información. Por otro lado, si va a almacenar un token en el archivo db, no creo que un JWT sea una mala elección para su tipo de token. Como dices, hay ventajas para la revocación si almacenas tu token en el db. Todo depende de lo que desee lograr (autorización más rápida, etc. frente a la capacidad de revocar a pedido).

Todavía puede usar JWT con OAuth2 sin almacenar tokens en el db si lo desea. Los JWT tienen un tiempo de caducidad configurable que puede establecer, después del cual no son válidos. Los tokens de acceso (ya sea JWT o no) generalmente deben ser efímeros por seguridad. Si la preocupación es que alguien robe el teléfono y se obtengan los tokens de acceso, creo que la solución es hacer que esos tokens caduquen rápidamente (¿30 minutos?). Si está usando oauth2, el medio para impedir que alguien continúe usando la aplicación es que el propietario real desautorice al cliente de la aplicación móvil en el servidor de autorización para que no se den más tokens de acceso.