Estoy implementando un token de actualización JWT y he desarrollado la siguiente forma de actualizar tokens. El siguiente es el flujo del programa:
- Cuando el servidor recupera la información de inicio de sesión, verifica la contraseña base de datos y crea un token JWT con un token de actualización como uno de sus Reclamaciones en la carga útil. (caracteres aleatorios). Se almacenará la actualización. token en una base de datos.
- Al iniciar sesión, el servidor devolvió el inicio de sesión: verdadero y el token de acceso JWT
- Dado que el token de actualización está dentro del JWT, no es necesario que dos tokens ser enviado
- Si el cliente envía un token de acceso que ha caducado, el servidor verifique el token de actualización en las notificaciones y vea si está dentro de la base de datos. Si es así, generará un nuevo token con un nuevo token de actualización, y Reemplace el token de actualización anterior en la base de datos con el nuevo.
- Si el cliente desea cerrar sesión en todos los dispositivos, simplemente puede revocar todos de sus tokens de actualización y se desconectarán cuando todos sus los tokens caducan (tokens JWT de 15 minutos).
Las ventajas que veo en esta implementación son:
- No es necesario enviar dos fichas. La actualización está incrustada dentro del JWT. y no se puede modificar porque eso invalidaría la firma.
- No es necesario cifrar el token de actualización en la base de datos porque si el atacante consiguió el token de actualización, no puede hacer nada con él porque está dentro del JWT y no se puede modificar. (En otras implementaciones con tokens separados debemos asumir una el atacante consigue una retención de ambos de todos modos)
Los problemas que veo con esto son:
- Los JWT siempre contienen el token de actualización, por lo que el atacante SIEMPRE estará capaz de realizar una actualización y usar el token de actualización hasta que caduque, a menos que el cliente lo revoque al cerrar sesión (de todos los dispositivos).
- El cliente puede ejecutar la llamada de inicio de sesión en un bucle y llenar la base de datos porque cada vez que inician sesión, se crea un nuevo token de acceso y un el nuevo token de actualización se almacena en la base de datos.
¿Este método es seguro? Si es así, me preocupa principalmente que alguien llene la base de datos con nuevos tokens de actualización y rellene el disco. ¿Cómo evito que eso suceda?