在身份验证令牌的情况下,客户端发送凭据,接收令牌并在所有后续调用中使用它。服务器需要保存令牌才能验证请求。
例如,对于 PHP 会话,服务器返回一个会话 UID,客户端在每个请求中发送该 UID。服务器需要保存会话。
在这两种情况下,服务器都需要保存状态,那么为什么前者被认为是无状态的呢?
在身份验证令牌的情况下,客户端发送凭据,接收令牌并在所有后续调用中使用它。服务器需要保存令牌才能验证请求。
例如,对于 PHP 会话,服务器返回一个会话 UID,客户端在每个请求中发送该 UID。服务器需要保存会话。
在这两种情况下,服务器都需要保存状态,那么为什么前者被认为是无状态的呢?
语义。会话通常通过为每个用户分配一个唯一的 ID 并将该 ID 存储在客户端 cookie 中来实现。身份验证令牌将完全相同 - 某种唯一的每个用户 ID。浏览器会在每次请求时自动发回 Cookie,并且可以在每次请求时发回身份验证令牌,但通常应仅在实际需要身份验证的请求上发送。
不同之处在于这些令牌在服务器上的处理方式。会话 ID 用于从存储中加载相应的会话(例如文件、数据库记录等),并且该会话数据将在请求之间持久保存。
身份验证令牌没有任何关联的会话文件。这更像是一个“我被允许在这里,这是证据”。
没有理由不能使用会话 ID 来实现身份验证系统。即使是一个简单$_SESSION['logged_in'] = true
的会话也会变成一个身份验证系统。
如果期望客户端总是为每个请求发送一个身份验证令牌,那么服务器实际上不需要保存状态。它在消息中包含确定如何评估请求所需的一切。
某些服务器体系结构(特别是我认为是 Java servlet)需要返回会话 cookie,但在下一次请求时将其传递回它们时,它们不需要使用它。在我的无状态 servlet 应用程序中,每个响应都会返回一个表示 JSESSIONID 的不同 cookie。所以,在这种情况下,它只是背景噪音。
大多数会话是有状态的,原因有两个:
首先,您在这个问题中描述的是会话管理,而不是令牌管理。
SessionIds 由业务系统自己生成。工作流程与您的问题相同。
而代币通常由独立系统生成和管理,而不是业务系统。当客户端在获得令牌后向业务服务器发送后续调用时,业务服务器必须从令牌系统验证令牌。所以当我们谈到业务系统时,我们说它是无状态的。
此外,在我看来,令牌不是为处理身份验证而生的,它旨在保护重要信息的安全。
参考: