Web API 是无状态的。如果我们使用 JWT 身份验证,那么我们需要使用 JWT 令牌维护用户状态,那么我们怎么能说 API 是安全的呢? [重复]

问题描述 投票:0回答:2

要使 Web API 休息,它应该是无状态的。 如果我们使用 JWT 身份验证,那么我们需要使用 JWT 跟踪用户,我们怎么能说带有 JWT 令牌的 API 是休息的呢?

rest jwt webapi
2个回答
2
投票

要使 Web api 休息,它应该是无状态的。

正确。

我会引用 Roy Fielding 的论文(强调我的):

5.1.3 无状态

我们接下来为客户端-服务器交互添加一个约束:通信本质上必须是无状态的,如第 3.4.3 节的客户端-无状态-服务器 (CSS) 风格(图 5-3),这样来自的每个请求客户端到服务器必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文。因此,会话状态完全保留在客户端上。

如果我们使用 JWT 身份验证,那么我们需要使用 JWT 跟踪用户

(我假设“JWT 身份验证”是指使用

Bearer
方案和 HTTP
Authorization
header
的 HTTP 身份验证方案,其中标头的
<authorization-parameters>
字段是 JWT 令牌本身)。

当网络服务使用独立的承载令牌对请求进行身份验证和授权时,这意味着客户端必须保留这些 JWT 令牌 - 而不是您或您的服务。客户端将从您的服务将身份验证和配置文件/ID 信息延迟到的 IdP 获取 JWT 令牌。

我们怎么能说带有 JWT 令牌的 API 是 REST?

因为:

  • 持有客户代币(默认情况下)是每个客户的责任。因此,客户端保持会话状态。
  • Fielding 的论文指出“因此会话状态完全保留在客户端上。”。
    • ...这与客户持有(并携带)其代币是一致的。

0
投票

无状态通信意味着您将会话(客户端状态的一部分)存储在客户端上,并与每个需要它的请求一起发送。在正常会话的情况下,会话存储在服务器上,客户端仅发送会话 ID。对于 JWT,您需要对令牌进行签名,因为您不希望客户端修改其中的用户 ID 之类的内容,但客户端会存储会话数据。由于可扩展性,这一点很重要。当您有几千台服务器并且哪台服务器收到请求是随机的时,那么在服务器端维护会话就变得非常困难。要么您在每台服务器上创建所有会话的副本,同步副本就会成为一场噩梦,要么您将其维护在单个服务器上,这最终会崩溃。因此最好将会话数据保留在客户端上,这样您就可以通过一点通信开销来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.