Cookie vs.会话vs jwt


12

我正在阅读Web应用程序中的身份验证/授权。有人可以确认/纠正我目前的知识吗?

  • Cookies:在其早期版本中,具有唯一客户端的文本文件会标识与该客户端有关的所有其他信息(例如角色)

  • 会话:只有唯一的客户端ID在文件中发送(也称为Cookie),其他所有内容都存储在服务器上

  • JWT:所有内容都存储在令牌中(也可以存储在文本文件中,也称为Cookie)

感谢您的任何反馈!

Answers:


12

Cookies:在其早期版本中,具有唯一客户端的文本文件会标识与该客户端有关的所有其他信息(例如角色)

Cookies是key-value最初用于保存与客户活动有关的数据的元组。我们将这种保留称为会话应用程序状态。从根本上讲,它们是为保持Web应用程序状态而设计的。更具体地说,是客户端的状态。(1)

Cookie通常由服务器通过响应标头(Set-Cookie key=value)设置。但是,它们也可以由客户端设置。例如,通过DOM(document.cookie)。

关于Cookie的重要一件事是它们无法识别用户。他们宁愿关联Terna 数据-客户端-服务器/路径(3)

我们通常将Cookie与文件相关联,因为在Web浏览器的早期,他们必须以某种方式保留cookie,这是文件最可行的支持。当今的浏览器(除其他外)将cookie存储在本地存储(嵌入式DB)中。

会话:只有唯一的客户端ID在文件中发送(也称为Cookie),其他所有内容都存储在服务器上。

就会话而言,我想您的意思是服务器会话。正如我所评论的,会话也可以在客户端实现。客户端会话的区别在于数据存储在服务器端的某个位置。(2)在这种情况下,我们得到的是会话ID;然后以Cookie的形式获取 没有会话ID,服务器将无法将传入请求与客户端的先前活动相关联。(3)例如,经过身份验证的用户,购物车等。

无论如何,会话ID不一定标识用户。它将特定的应用程序状态与Web客户端关联。会话可能包含或可能不包含用户数据。

在分布式应用中,出于明显的原因,会话应可序列化。如果它们存储在内存中,则内存存储(组件)应可序列化。常见的解决方案是将会话存储在文件中。或像Redis这样的NoSQL DB。

关于安全性。服务器端会话比客户端安全。客户通常更容易受到威胁的威胁,因为用户通常不知道他们所面临的威胁太多。至少不是普通用户。

另一方面,攻击服务器端基础架构并非易事。

JWT:所有内容都存储在令牌中(也可以存储在文本文件中,也称为Cookie)

并不是的。JWT存储主要与令牌的授权和发行者有关的数据。

尽管它们用来包含用户ID(子),但我们发现JWT无法识别经过身份验证的用户。例如,来宾会话的令牌。JWT的主要内容是索赔 ; 授权流程要检查的项目。

请记住,JWT不是全局存储,这一点很重要。该会话应用程序状态仍有待存储的地方,并独立管理。

关于JWT,尽管它们也可以存储在本地存储中,但它们通常存储为cookie。此外,OWASP社区认为sessionStorage对于Web浏览器来说更安全。但是,这取决于浏览器的版本


1:万维网注定是无状态的。如果我们要构建无状态服务器端应用程序,则会话应存储在客户端的某个位置。

2:将服务器端应用程序转换为有状态应用程序。

3:客户端作为应用程序,而不是用户。


请注意,有些文件(例如默认的Ruby on Rails配置)将整个“会话”对象存储在cookie(通常通常是加密的日子)中,该cookie可能只包含user_id已登录用户的内容。
Fire Lancer

7

Cookies:在其早期版本中,具有唯一客户端的文本文件会标识与该客户端有关的所有其他信息(例如角色)

您对cookie的定义并不能真正描述它们的作用。Cookie是Set-Cookie由服务器通过HTTP响应标头()设置并由支持它们的客户端存储的键值对。Cookie随每个后续请求(在Cookie标头中)一起发送回去,以获取与方案,主机,路径,https匹配的请求,而cookie尚未过期。您可以将所需的任何内容存储在cookie中,它允许您支持HTTP无状态协议上的状态。

Cookie交换示例如下所示:

在此处输入图片说明

会话:只有唯一的客户端ID在文件中发送(也称为Cookie),其他所有内容都存储在服务器上

没错。会话是在服务器端存储的有关用户当前会话的数据。为了使此功能以HTTP之类的无状态协议运行,用户必须随每个请求发送其会话ID,以便服务器可以为用户获取正确的会话。会话ID通常存储在Cookie中(请参见上文)。这与任何其他cookie都不一样,它只是用户会话的服务器ID。

JWT:所有内容都存储在令牌中(也可以存储在文本文件中,也称为Cookie)

那是真的。一切都存储在令牌中。令牌可以存储在cookie中(请参见上文)。这是服务器会话的替代方法,并且可以工作,因为令牌是由服务器签名和验证的,因此不能更改或伪造令牌,并且可以安全地存储在客户端。


根据我的经验,JWT通常不会存储在Cookie中。它们可能是,但更常见的是,我在通往服务器的途中在自己的标头(或通常是授权标头)中看到了它们,并存储在内存中或客户端的本地或会话存储中。
保罗

1
@Paul关于本地存储。这取决于客户。并非所有客户端,也不是最常用客户端的所有版本都支持Web存储。在这里看看。如果是这样,最好将令牌设为季节性。但是,如果我们的客户不支持本地存储;Httponly cookie + SSL +客户端指纹为我们提供了一个相当安全的实现。
Laiv

@莱夫,我不同意你的看法。只是塞缪尔(Samuel)说过“令牌存储在cookie中”,而我只是想观察到情况并非总是如此。
保罗

@Paul我改为读“ ...可能存储在cookie中”
塞缪尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.