【问题标题】:Is it a good practice to store JWT Tokens in memory将 JWT 令牌存储在内存中是否是一种好习惯
【发布时间】:2020-05-27 13:19:04
【问题描述】:

我编写了一个 asp.net core 3.0 Web api,我在其中使用 JWT 令牌对用户进行身份验证。一旦用户获得令牌,他/她就可以使用它直到它过期。

我所做的是我还在内存中存储了这个令牌进行身份验证,以获得其他最小的细节,例如用户名、生成的令牌和“令牌”。

  1. 我的第一个问题是这是一个好习惯吗?因为令牌是无状态的,因此服务器端免去了维护它的麻烦。

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

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

【问题讨论】:

    标签: asp.net-core jwt-auth


    【解决方案1】:
    1. 是的,将 JWT 缓存在 Redis 等内存缓存或简单的内存缓存中是一种很好的做法。新创建的令牌缓存在内存中,缓存驱逐时间与令牌过期时间相同。
    2. 当一个请求进入验证令牌时,它首先检查它是否存在于内存缓存中,如果不存在,则将查看持久存储,如 db。
    3. 当用户使令牌无效(即注销)时,应将其从缓存中删除,并将状态更新为数据库中的无效。

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

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

    https://devtoolzone.com/decoder/jwt

    干杯, 拉克什马南

    【讨论】:

      【解决方案2】:

      当您说“在内存中”时,是指在客户端计算机本地还是在服务器某处?我将假设您的意思是客户端供他们使用。

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

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

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

      【讨论】:

      • Nope..in-memory 意味着我将它存储在服务器端(services.AddMemoryCache)。我的用户通常是 3-4 (他们不是真正的用户,而是试图访问我的 api 的其他应用程序),因此所有登录用户/应用程序的列表不应该很长。
      • @Samra 然后适用此处发布的相同规则。保留一个副本前端,您可以将它们保留在后端存储为一个类。完成后清空空间或将其值设置为 null 。如果您不想使用数据库进行扩展,这就足够了。
      • 在内存中保存token是违反Stateless的概念的,没有办法让所有登录的用户都用这种方式。你可以做的只是保存关于token的一小段信息,比如内存中的 UserId 和 expireDate。所以每当你想登录时,用户就从这个列表中读取。
      • 还有一个建议。不要将令牌保存在 cookie 中,将它们保存在会话存储中,因为它无法从 javascript 访问。
      • @Mohammadniazmand,您可以将令牌存储为 HttpOnly cookie,并且 JavaScript 也无法访问。
      猜你喜欢
      • 2019-03-24
      • 2022-09-30
      • 2015-06-23
      • 1970-01-01
      • 2020-06-10
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多