为什么认证令牌被视为无状态而会话不是?

8
在身份验证令牌的情况下,客户端发送凭据,接收令牌并在所有后续调用中使用它。服务器需要保存令牌以验证请求。
例如,对于PHP会话,服务器返回会话UID,客户端在每个请求中发送该UID。服务器需要保存会话。
在这两种情况下,服务器都需要保存状态,那么为什么前者被认为是无状态的?

好问题。但是会话不是可以存储会话信息或者会话状态吗? - giZm0
3个回答

1
语义学。一般通过为每个用户分配一个唯一的ID并将该ID存储在客户端cookie中来实现会话。认证令牌将是完全相同的东西-某种独特的每个用户ID。浏览器自动发送Cookies以便在每次请求时返回,而认证令牌可以在每次请求时发送回来,但通常只应在实际需要身份验证的请求上发送。
这种区别与服务器上如何处理这些令牌有关。会话ID用于从存储中加载相应的会话(例如文件、数据库记录等),并且会话数据将在请求之间保留。
认证令牌没有任何关联的会话文件。它更像是“我被允许在这里,这是证明”。
没有理由不能使用会话ID来实现身份验证系统。即使简单的$_SESSION['logged_in'] = true也会将会话转换为身份验证系统。

1
如果客户端的期望是每个请求都会发送一个身份验证令牌,那么服务器实际上不需要保存状态。它在消息中拥有评估请求所需的一切。
某些服务器架构(我特别考虑 Java Servlets)需要返回会话 cookie,但在下一个请求中传递回来时并不需要使用它。在我的无状态 servlet 应用程序中,每个响应都返回一个代表 JSESSIONID 的不同 cookie。因此,在这种情况下,它只是背景噪音。
大多数会话是有状态的,原因如下:
  • 客户端传递的标识符在没有先前与服务器交互的情况下无法解析为有意义的凭据集(它们通常只是由服务器分配的随机值)
  • 标识符具有内在寿命,该寿命在标识符内部是无法发现的

0

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

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

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

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

参考:

PCI DSS tokenization

Redhat token management system


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接