繁体   English   中英

在基于令牌的身份验证中使用 Refesh 令牌是否安全?

[英]Using Refesh Token in Token-based Authentication is secured?

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

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

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

我不明白一些事情,我可能会遗漏一些东西:

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

  2. Cookie 可以被窃取和使用,直到它们过期。 令牌是短暂的,所以它们更安全,但如果我提供一个长期的刷新令牌,我就失去了使用令牌的优势。

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

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

我使用以下方法:

表/索引:

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

认证流程

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

2. 确保 JWT 的过期时间对您的用户来说是小的/舒适的。 一般不到一个小时。

4.当客户端使用 JWT 发出请求时

一种。 检查访问令牌的到期时间。 如果令牌未过期 -> 继续而不触及任何数据库表。

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

如果是,则发出带有响应的新 JWT,并将新的刷新令牌、访问令牌更新到 JWT 表中。

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

结尾。

总结一下,

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

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

3.所有与用户相关的 JWT 都可以失效,通过从 JWT 表中擦除与该用户相关的刷新令牌,这可以完成,例如:当用户更改他/她的密码时。 这实际上将妥协窗口缩小到访问令牌/JWT 的到期时间。

我相信这是 JWT 背后的意图。 DB 调用/用户的百分比取决于您的到期时间、用户通常在您网站上的持续时间等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM