根据这篇文章http://www.jianshu.com/p/b11accc40ba7 保护JWT的一种方法是refreshToken:
在中心auth服务器中,我们维护一个这样的表:
table auth_tokens(
user_id,
jwt_hash,
expire
)
以下是工作流程:
用户通过电话请求登录API,我们验证了它,之后,auth服务器发送一个令牌,并注册令牌(在表中添加一行。)
当令牌过期时,用户使用旧令牌请求交换API。首先,auth服务器将旧令牌验证为正常,除了过期检查,然后创建令牌哈希值,然后按用户ID在表上查找:
一个。如果找到记录,并且user_id和jwt_hash匹配,则发出新的 令牌并更新表格。
湾如果找到记录,但user_id和jwt_hash不匹配,则表示 有人之前使用过令牌交换了新令牌。令牌是 黑客攻击,用user_id删除记录,用alert提醒 信息。
℃。如果没有找到记录,用户需要再次登录或只输入密码。 当使用更改密码或登出时,按用户ID删除记录。
要连续使用令牌,合法用户和黑客都需要连续交换新令牌,但只有一个能成功,当一个失败时,都需要在下次交换时再次登录。
因此,如果黑客获得令牌,它可以短时间使用,但如果合法用户下次更换新签名则无法交换新签名,因为令牌有效期短,更安全。
如果没有黑客,普通用户也需要定期交换新令牌,例如每30分钟,这就像自动登录一样。额外负载不高,我们可以调整应用程序的到期时间。
但想象一下这句话:
例如,黑客获得了鲍勃的令牌,他知道鲍勃在凌晨1点到早上6点睡觉, 因此,黑客可以在晚上连续使用toke,直到Bob第二天起床并使用该应用程序。
一个解决方案是在晚上,用户应该输入用户而不是令牌,但这不是我想法中的好解决方案! 你知道更好的解决方案吗?
提前致谢
答案 0 :(得分:0)
这个解决方案充满了缺点和优点:
需要服务器存储空间。你失去了JWT的无国籍状态。即使是永远不会被撤销的令牌
令牌,事实上,可以永远使用只是用旧版本刷新
每个用户一个令牌意味着一个且只有一个使用API的设备。例如,在移动设备上登录会使桌面浏览器中的会话无效
攻击者可以在用户睡觉时使用令牌(正如您所指出的那样)
然后,优点:你可以撤销令牌。如果你真的需要它(建议JWT让令牌过期)我相信有很简单的方法来实现它。见Invalidating client side JWT session
请注意,您的问题开始讨论"刷新"令牌,但后来你描述了一个自定义机制来刷新和撤销哪些无关。刷新令牌是长期存在的,持久性仅用于获取短期访问令牌