8

在身份验证令牌的情况下,客户端发送凭据,接收令牌并在所有后续调用中使用它。服务器需要保存令牌才能验证请求。

例如,对于 PHP 会话,服务器返回一个会话 UID,客户端在每个请求中发送该 UID。服务器需要保存会话。

在这两种情况下,服务器都需要保存状态,那么为什么前者被认为是无状态的呢?

4

3 回答 3

1

语义。会话通常通过为每个用户分配一个唯一的 ID 并将该 ID 存储在客户端 cookie 中来实现。身份验证令牌将完全相同 - 某种唯一的每个用户 ID。浏览器会在每次请求时自动发回 Cookie,并且可以在每次请求时发回身份验证令牌,但通常应仅在实际需要身份验证的请求上发送。

不同之处在于这些令牌在服务器上的处理方式。会话 ID 用于从存储中加载相应的会话(例如文件、数据库记录等),并且该会话数据将在请求之间持久保存。

身份验证令牌没有任何关联的会话文件。这更像是一个“我被允许在这里,这是证据”。

没有理由不能使用会话 ID 来实现身份验证系统。即使是一个简单$_SESSION['logged_in'] = true的会话也会变成一个身份验证系统。

于 2013-11-07T15:58:56.367 回答
1

如果期望客户端总是为每个请求发送一个身份验证令牌,那么服务器实际上不需要保存状态。它在消息中包含确定如何评估请求所需的一切。

某些服务器体系结构(特别是我认为是 Java servlet)需要返回会话 cookie,但在下一次请求时将其传递回它们时,它们不需要使用它。在我的无状态 servlet 应用程序中,每个响应都会返回一个表示 JSESSIONID 的不同 cookie。所以,在这种情况下,它只是背景噪音。

大多数会话是有状态的,原因有两个:

  • 如果没有先前的服务器交互,客户端传递的标识符无法解析为一组有意义的凭据(它们通常只是服务器分配的随机值)
  • 标识符具有在标识符中无法发现的隐式生命周期
于 2013-11-07T16:21:57.340 回答
0

首先,您在这个问题中描述的是会话管理,而不是令牌管理。

SessionIds 由业务系统自己生成。工作流程与您的问题相同。

而代币通常由独立系统生成和管理,而不是业务系统。当客户端在获得令牌后向业务服务器发送后续调用时,业务服务器必须从令牌系统验证令牌。所以当我们谈到业务系统时,我们说它是无状态的。

此外,在我看来,令牌不是为处理身份验证而生的,它旨在保护重要信息的安全。

参考:

PCI DSS 标记化

红帽令牌管理系统

于 2015-02-13T10:06:48.713 回答