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