在基于令牌的身份验证中使用刷新令牌是不是安全?
Posted
技术标签:
【中文标题】在基于令牌的身份验证中使用刷新令牌是不是安全?【英文标题】:Using Refesh Token in Token-based Authentication is secured?在基于令牌的身份验证中使用刷新令牌是否安全? 【发布时间】:2015-02-06 04:10:38 【问题描述】:我正在构建基于令牌的身份验证(Node.js 使用护照/JWT 和 Angular 客户端)。
用户输入他的凭据后,他会获得一个访问令牌,他会在每个请求的标头中发送该令牌(标头:bearer TOKEN)。
我不想每次他的访问令牌过期时都提示登录请求(我猜是每天), 我听说过Refresh Tokens。刷新令牌永远不会过期(或很少过期)并且能够无限期地更新令牌。当访问令牌即将过期时,客户端可以通过发送他的刷新令牌来发送更新请求以获取新的访问令牌。
我不明白一些东西,我可能会遗漏一些东西:
长寿命/永不过期的刷新令牌如何不破坏短寿命的安全性 访问令牌。
Cookie 可以被盗用,直到过期。代币是短暂的,所以它们更安全, 但如果我提供一个长期存在的刷新令牌,我将失去使用令牌的优势。
注意:我知道刷新令牌是在初始登录时发送的,因此不能在每个请求中都被欺骗,但如果它们在初始请求中被欺骗,它们很容易受到攻击。
【问题讨论】:
【参考方案1】:我使用以下方法:
表格/索引:
-
用户表(只有用户 ID 和所有用户相关的元数据)
JWT 表(三个字段:user_id、access_token、refresh_token)
身份验证流程
1.当以前未经身份验证的用户登录时,发出一个包含访问令牌和刷新令牌的 JWT。更新 JWT 表中的刷新令牌,连同 user_id 和访问令牌。
2. 确保 JWT 的过期时间对您的用户来说是较小的/舒适的。通常不到一个小时。
4.当客户端使用 JWT 发出请求时
一个。检查访问令牌的到期时间。如果令牌尚未过期 -> 继续而不命中任何数据库表。
b.如果访问令牌已过期,则在 JWT 表中查找 user_id,并检查刷新令牌和访问令牌是否匹配,无论客户端提供什么,
如果是,则发出带有响应的新 JWT,并将新的刷新令牌、访问令牌更新到 JWT 表中。
如果不是,返回 401。客户端被强制要求用户登录。
结束。
总结一下,
1.DB调用只需要检查刷新令牌是否有效。
2.该系统允许用户使用任意数量的 JWT 从任意数量的设备登录
3.通过从 JWT 表中擦除与该用户相关的刷新令牌,可以使与用户相关的所有 JWT 无效,例如:当用户更改他/她的密码时。实际上,这缩小了访问令牌/JWT 到期时间的妥协窗口。
我相信这就是 JWT 背后的意图。数据库调用/用户的百分比取决于您的过期时间、用户通常在您网站上的持续时间等。
【讨论】:
【参考方案2】:刷新令牌呈现在与访问令牌不同的路径上:访问令牌只呈现给资源服务器,刷新令牌只呈现给授权服务器。访问令牌可以是自包含的,因此它不需要对授权服务器进行昂贵的调用来检查其有效性,但是为了减少损失并提高准确性(如果出现问题,它不能被撤销)它是短暂的。刷新令牌是长期存在的,并且在每次调用授权服务器时都会得到验证,因此它可以被撤销。两者的结合使系统更加安全。
【讨论】:
我想我开始明白了。所以访问令牌在客户端和服务器之间传递,刷新令牌在服务器和授权服务器之间传递。但是如果我的服务器同时具有资源和授权逻辑并且没有在不同的授权服务器上中继怎么办?那么刷新令牌将是不必要的,当客户端提供过时的访问令牌或即将到期的访问令牌时,我将简单地生成一个新令牌并将其传递给他?这是否意味着如果黑客拥有访问令牌,他可以永远利用它,只是一遍又一遍地更新它? 一个新的访问令牌应该只基于某种“授权授予”授予客户端,正如 OAuth 2.0 所说的那样,并且不能仅仅基于拥有一个旧的访问令牌,否则确实令牌的生命周期没有意义 你能告诉我我可以使用哪些授权授权而不要求用户再次输入他的凭据? (为了避免每次访问令牌过期都提示登录) 那是刷新令牌授权...如果黑客获得刷新令牌,它应该被撤销,并且将再次提示用户进行身份验证;同一枚硬币的两面:要么依赖现有令牌,要么提示用户进行身份验证;如果您的客户不安全,无论如何都没有补救措施 嗨,Hanz,你能帮我解决这个问题吗***.com/questions/28759590/…以上是关于在基于令牌的身份验证中使用刷新令牌是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章
如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?