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

时间:2020-02-12 03:23:38

标签: asp.net-core jwt-auth

我写了一个 asp.net core 3.0 Web api,我在其中使用JWT令牌来验证用户身份。用户获得令牌后,就可以使用令牌直到令牌过期。

我所做的是,我还在身份验证中将该令牌存储在内存中,以获取其他最小细节,例如用户名,在生成的令牌和“令牌”。

  1. 我的第一个问题是,这是一种好习惯吗?由于令牌是无状态的,因此可以节省服务器端的维护麻烦。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

除了令牌到期时间外,您可能还想添加其他检查验证,具体取决于JWT的内容(声音声明,签名验证等)。 要回顾JWT令牌的内容,可以使用下面的工具

https://devtoolzone.com/decoder/jwt

干杯, 拉克希玛南

答案 1 :(得分:1)

当您说“在内存中”时,这是在客户端计算机上还是在服务器中的某处?我将假设您是指在客户端使用它们。

我目前正在自己​​使用JWT,所以这里是我的建议:

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

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

相关问题