为什么身份验证令牌被认为是无状态且会话不是?

时间:2013-11-07 15:46:25

标签: php rest session authentication token

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

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

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

3 个答案:

答案 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由业务系统本身生成。工作流程与您的问题相同。

虽然代币通常由独立系统生成和管理,但业务系统。当客户端在获得令牌后将后续调用发送到业务服务器时,业务服务器必须从令牌系统验证令牌。因此,当我们谈论业务系统时,我们说它是无国籍的。

此外,在我看来,令牌并非用于处理身份验证,它旨在保护重要信息的安全。

参考:

PCI DSS tokenization

Redhat token management system