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