Planeo usar JWT para mi sistema de inicio de sesión para dispositivos móviles. No hay un flujo de trabajo estándar real para actualizar tokens JWT que pueda encontrar, así que creé este a continuación. La razón por la que quiero usar JWT es por razones de rendimiento. En lugar de verificar si un usuario es válido con una llamada de base de datos para cada solicitud, confío en el JWT.
Tengo el flujo de trabajo propuesto que quiero implementar en mi aplicación. ¿Es esto aceptablemente seguro? ¿Eficiente? ¿Hay algún problema obvio que esté supervisando? ¿Qué mejoras razonables se pueden hacer?
El usuario inicia sesión
- Si no existe un token firmado HMAC dentro de localstorage, el usuario le da un nombre al dispositivo.
- DeviceName se envía al servidor donde se inserta en la base de datos.
- El token JWT + el token firmado HMAC de DeviceName se devuelven al usuario. El token firmado HMAC se coloca para asegurarse de que el token jwt (que contiene DeviceName) se envíe desde el mismo dispositivo que lo llamó originalmente.
- El token JWT es válido durante X horas, por lo que un usuario puede realizar cualquier llamada durante X horas.
- Después de X horas, el JWT ha caducado. Cuando se realiza una solicitud, el servidor puede ver que el JWT ha caducado. El servidor ahora intentará actualizar el token JWT. El servidor comprueba la base de datos para ver si el Nombre del dispositivo especificado en el token firmado HMAC es el mismo que el nombre de dispositivo válido en la base de datos para ese usuario.
- Si es así, cree un nuevo JWT válido por otras X horas, si no es así, envíe un mensaje para solicitar que inicie sesión.
Si una cuenta está comprometida:
El usuario puede iniciar sesión en mi servicio de contraseña. Una vez que haya iniciado sesión, me gustaría recuperar todos los dispositivos para ese usuario, el usuario puede revocar su dispositivo comprometido. Una vez hecho esto, una solicitud para actualizar el JWT no funcionará con el token robado.
Todo esto, por supuesto, ocurre sobre SSL.
Mis preocupaciones que no tengo soluciones para:
-
Si se roba un token JWT, el atacante tiene X horas para hacer llamadas según la víctima. ¿Creo que esta es la naturaleza de los tokens y un riesgo aceptado?
-
Si el JWT es robado, eso significa que existe una buena posibilidad de que el token HMAC que contiene el nombre del dispositivo también sea secuestrado para que el usuario pueda actualizar los tokens hasta que la víctima se dé cuenta de que su cuenta está comprometida y revoque el acceso. ¿Es esta práctica aceptada?