将 JWT 令牌存储在内存中是一个好习惯吗

Sam*_*mra 4 asp.net-core jwt-auth

我写了一个asp.net core 3.0 web api,我使用 JWT 令牌来验证用户。一旦用户获得令牌,他/她就可以使用它直到它到期。

我所做的是,我还在身份验证时将此令牌存储在内存中,以获取其他最少的详细信息,例如用户名、生成的令牌和“令牌”。

  1. 我的第一个问题是这是一个好的做法吗?由于令牌是无状态的,因此可以使服务器端免于维护它的麻烦。

  2. 我的第二个问题是,如果这样做是可以接受的,那么一旦令牌过期,我如何从内存中删除此令牌信息。

  3. 如果我没有将此令牌存储在内存中,如何提取诸如“获取所有登录用户的列表”之类的信息。

小智 7

  1. 是的,将 JWT 缓存在内存缓存(如 Redis)或简单的内存缓存中是一个很好的做法。新创建的令牌缓存在内存中,缓存驱逐时间与令牌到期时间相同。
  2. 当一个请求进来验证令牌时,它首先检查它是否存在于内存缓存中,如果不存在,则将查找到像 db 这样的持久存储。
  3. 当用户使令牌无效(即注销)时,应将其从缓存中删除并将状态更新为无效的 db。

在分布式应用程序中,维护状态是一个挑战。出于这个原因,最好有由 redis 支持的单独缓存层。这样,我们就可以保持应用程序无状态。

除了令牌过期时间之外,您可能还需要添加额外的验证检查,这取决于 JWT 的内容,例如(审计声明、签名验证等)。要回顾 JWT 令牌的内容,您可以使用如下工具

https://devtoolzone.com/decoder/jwt

干杯,拉克什马南


Arc*_*Arc 3

当您说“在内存中”时,这是否意味着在客户端计算机本地或服务器中的某个位置?我假设你指的是供他们使用的客户端。

我目前自己正在使用 JWT,因此以下是我的建议:

1) 将令牌保存在会话存储中。2)只需清空会话(或您存储会话的任何位置)。3)如果你想访问它,你肯定需要将它存储在某个地方。但是获取所有用户的列表听起来像是您想要后端的数据。您可以在后端服务器上跟踪它,但通常这些令牌会被处理并保存到数据库中。但即使在后端服务器上,您也可以只使用一组 Client 对象来跟踪哪些对象已登录(即哪些对象具有未过期的令牌)。

典型的做法是生成两个令牌(身份验证令牌和刷新令牌),然后在用户提交令牌进行身份验证时根据数据库检查它们。