基于会话/cookie 的身份验证是有状态的还是无状态的?

信息安全 验证 饼干 会话管理
2021-08-26 01:29:00

烧瓶网络开发

当前借助 Flask-Login 实现的登录功能将数据存储在用户会话中,Flask 默认存储在客户端 cookie中,因此服务器不存储任何与用户相关的信息它要求客户存储它。看起来这个实现符合 REST 的 无状态 要求,但是在 RESTful Web 服务中使用 cookie 属于灰色区域,因为对于不是 Web 浏览器的客户端来说实现它们可能很麻烦。因此,通常认为在 API 中使用 cookie 是一个糟糕的设计选择。

https://stackoverflow.com/a/59826012/说:

基于会话的身份验证是有状态的。这意味着身份验证记录或会话必须同时保存在服务器端和客户端后端跟踪数据库中的活动会话,而在前端创建一个包含会话标识符的 cookie。

https://dzone.com/articles/cookies-vs-tokens-the-definitive-guide

基于 Cookie 的身份验证是有状态的。这意味着身份验证记录或会话必须同时保存在服务器端和客户端。服务器需要跟踪数据库中的活动会话,而在前端创建一个包含会话标识符的 cookie,因此名称为基于 cookie 的身份验证。

基于会话的身份验证与基于 cookie 的身份验证相同是否正确?

基于会话/cookie 的身份验证是否在服务器端存储用户/会话/...?

它是有状态的还是无状态的?

基于 cookie 的身份验证和基于令牌的身份验证之间的区别是否正是前者未签名,而后者是?

谢谢。

1个回答

基于会话的身份验证与基于 cookie 的身份验证相同是否正确?

这些短语是不一样的:“基于cookie”反映了会话信息是如何传输的,而“基于会话”反映了使用会话而不是每次交易都必须再次登录。“基于会话”可以使用 cookie 实现,通常是这样,但这不是实际要求。例如,也可以在 URL 中传输会话。

基于会话/cookie 的身份验证是否在服务器端存储用户/会话/...?

不必要。所有信息都可以存储在(签名/加密的)cookie 中,因此只有客户端实际存储信息,服务器可以从 cookie 中提取信息。或者,cookie 可以只是在服务器数据库中查找信息的密钥,无需对其进行签名/加密。

它是有状态的还是无状态的?

取决于这些术语在特定上下文中的含义/解释。首先,与每个请求一起发送身份验证凭据的情况相比,在进行会话时总会涉及到一个状态。因此,从这个角度来看,基于会话的身份验证始终是有状态的。

但在某些情况下,问题是服务器和客户端是否都保留状态信息。在这种解释中,如果所有状态信息都包含在会话 cookie 中,则它不是有状态的,因为服务器仅从 cookie 中提取状态,并且可能通过发送新 cookie 来更新状态,但实际上并不在本地存储状态。

基于 cookie 的身份验证和基于令牌的身份验证之间的区别是否正是前者未签名,而后者是?

它们不相同但相似。会话 cookie 通常由服务器最初设置,然后由客户端在CookieHTTP 标头字段内的每个请求中隐式反映身份验证令牌通常以其他方式创建(例如在注册服务时),并由客户端显式添加到请求中,通常在AuthorizationHTTP 标头字段中。会话 cookie 和身份验证令牌对客户端都是不透明的,因为它不关心(并且通常不知道)内部结构。