【发布时间】:2021-11-17 00:31:00
【问题描述】:
我目前正在构建一个 Node.js 应用程序并尝试使用 JWT 来处理会话。在我见过的每个实现中,refresh-token 都存储在一个快速的数据库中,比如redis。当令牌过期时,客户端发送refresh-token获取新的access-token,然后服务器检查refresh-token是否在数据库中,然后生成一个新的令牌。
但是既然refresh-token必须是服务端生成的,不能被篡改,而且我们也可以检查一下是否过期了,为什么还要保存呢。如果是logout,那么我们不能把user_id存储在数据库中,供已经登录的人使用,而不存储refresh-token。
我还考虑在redis 中存储最新的access-token 而不是refresh-token 作为user_id 的值。原因是我们只会在前一个过期时生成一个新的access-token。所以下面的场景不可能发生,
- 用户登录,获取
access-token和refresh-token。 - 在前一个令牌仍然有效时立即刷新他们的令牌。
- 注销并使用其旧的访问令牌。
由于大多数实现仅将客户端在注销期间提供的access-token 列入黑名单,因此我相信如果客户端使用 REST API,这种情况是可能的。
那么存储refresh-token 有什么用,而存储access-token 会以任何方式有益。有关该应用程序的更多信息,
- 我将
redis用于登录用户,并将access-token列入黑名单(在注销时提供)。 - 我将
refresh和access令牌存储在 httpOnly cookie 中,并将access令牌作为不记名令牌发送。 -
refresh-token在刷新访问令牌时在 POST 正文中发送。 - 我没有使用
https
【问题讨论】: