我计划将 JWT 用于我的移动设备登录系统。我找不到用于刷新 JWT 令牌的真正标准工作流程,所以我在下面创建了这个。我想使用 JWT 的原因是出于性能原因。我信任 JWT,而不是检查用户是否对每个请求的数据库调用有效。
我有我想在我的应用程序中实施的建议工作流程。这是可以接受的安全吗?高效的?我正在监督有什么明显的问题吗?可以做出哪些合理的改进?
用户登录
- 如果本地存储中不存在 HMAC 签名令牌,则用户为设备命名。
- DeviceName 被发送到它被插入数据库的服务器。
- DeviceName 的 JWT 令牌 + HMAC 签名令牌发送回用户。放置 HMAC 签名令牌以确保 jwt 令牌(包含 DeviceName)是从最初调用它的同一设备发送的。
- JWT 令牌在 X 小时内有效,因此用户可以在 X 小时内拨打任何电话。
- X 小时后,JWT 过期。当发出请求时,服务器可以看到 JWT 已过期。服务器现在将尝试刷新 JWT 令牌。服务器检查数据库以查看 HMAC 签名令牌中指定的 DeviceName 是否与数据库中该用户的有效设备名称相同。
- 如果是,则创建另一个 X 小时有效的新 JWT,如果否,则发回消息以要求登录。
如果帐户被盗:
用户可以登录我的密码服务。登录后,我会检索该用户的所有设备,然后用户可以撤销他们被入侵的设备。完成此操作后,刷新 JWT 的请求将无法使用被盗令牌。
当然,所有这些都发生在 SSL 上。
我没有解决方案的担忧:
如果 JWT 令牌被盗,攻击者有 X 小时的时间根据受害者拨打电话。我认为这是代币的本质和可接受的风险?
如果 JWT 被盗,这意味着包含设备名称的 HMAC 令牌很可能也被劫持,因此用户可以刷新令牌,直到受害者意识到他们的帐户被盗并撤销访问权限。这是公认的做法吗?