在基于令牌的身份验证中使用刷新令牌是安全的吗?

时间:2014-12-08 13:27:44

标签: security token access-token jwt http-token-authentication

我正在构建基于令牌的身份验证(Node.js使用带有角度客户端的passport / JWT)。

在用户输入他的凭据后,他获得了一个访问令牌,他在头部(header:bearer TOKEN)内的每个请求中发送该令牌。

我不想在每次访问令牌过期时都提示登录请求(关于我每天的猜测), 我听说过Refresh Tokens。刷新令牌永不过期(或很少过期)并且能够无限期地更新令牌。当访问令牌即将到期时,客户端可以通过发送刷新令牌发送续订请求以获取新的访问令牌。

我不了解一些事情,我可能会遗漏一些东西:

  1. 长寿/永不过期的刷新令牌如何破坏短生命的安全性 访问令牌。

  2. Cookie可以被盗取并在到期前使​​用。代币生命短暂,因此更安全, 但如果我提供一个长期存在的刷新令牌,我将失去使用令牌的优势。

  3. 注意:我知道刷新令牌是在初次登录时发送的,因此在每个请求中都不会被欺骗,但如果它们在初始请求时被欺骗,则它们容易受到攻击。

2 个答案:

答案 0 :(得分:4)

刷新令牌显示在与访问令牌不同的路径上:访问令牌仅呈现给资源服务器,刷新令牌仅呈现给授权服务器。访问令牌可以是自包含的,因此它不需要昂贵的调用授权服务器来检查其有效性,但是为了减少损失并提高准确性(如果出现问题则无法撤销)它是短暂的。刷新令牌是长期存在的,并且在每次调用授权服务器时都会得到验证,因此可以撤销它。两者的结合使系统安全。

答案 1 :(得分:0)

我使用以下方法:

表/索引:

  1. 用户表(只有用户ID和所有与用户相关的元数据)
  2. JWT表(三个字段:user_id,access_token,refresh_token)

身份验证流程

1。当先前未经身份验证的用户登录时,发出一个JWT,其中包含访问令牌和刷新令牌。更新JWT表中的刷新令牌以及user_id和访问令牌。

2。确保JWT的到期时间对您的用户来说很小/不舒服。通常不到一个小时。

4。当客户端通过JWT发出请求时

a。检查访问令牌的到期时间。如果令牌尚未过期->继续操作,不打任何数据库表。

b。如果访问令牌已过期,请在JWT表中查找user_id,并检查刷新令牌和访问令牌是否匹配,无论客户端提供了什么,

如果是,请使用响应发出新的JWT,并将新的刷新令牌,访问令牌更新到JWT表中。

如果否,则返回401。客户端被迫要求用户登录。

END。

总结

1.DB调用仅需要检查刷新令牌是否有效。

2。该系统允许用户使用任意数量的JWT从任意数量的设备登录

3。通过从JWT表中擦除与该用户相关的刷新令牌,可以使与该用户相关的所有JWT无效,例如:当用户更改其密码时。实际上,这缩小了访问令牌/ JWT到期时间的折衷范围。

我相信这是JWT背后的意图。数据库调用/用户的百分比取决于您的到期时间,用户通常在您网站上的停留时间等。