会话和Cookie之间的关系

6

我了解了 SESSIONCOOKIE 之间的区别,但是我正在尝试找到它们之间的关系。我查看了多个网站,但无法得到相关的答案,感到困惑。Cookie 是在用户浏览器上生成还是在系统上生成?有些人说它是在系统上生成的,而其他链接则说它们是在用户浏览器上创建的。此外,会话以 cookie 或 cookie 文件的形式保存。这是真的吗?


参见:PHP中Session和Cookie的区别是什么? 请注意,同样的概念适用于任何编程语言。 - BenMorel
4个回答

28

Cookie

一个cookie只是一个存储在用户浏览器中的键值对。当您请求网页时,cookie将作为HTTP响应的一部分发送到您的浏览器。

当浏览器接收到cookie时,它会将其存储,并在同一网站上进行的每个后续请求中将其发送回服务器。

由于cookie是HTTP请求和响应标头的一部分,因此它们的大小受到一定限制。

通常存储在cookie中的信息:

  • 会话ID(见下文)
  • 跟踪ID(Google Analytics等)
  • 用户首选项(首选语言或货币等)

对于较大或敏感数据,通常将值存储在会话中。 cookie仅用于标识正确的会话。

可以配置cookie仅在关闭浏览器窗口之前存在,或具有可配置的生命周期(1周、1个月、1年等)。如果在此期间再次访问网站,则您的浏览器将在每个请求中发送cookie。

会话

会话是通常作为键值对存储在服务器上的一组数据。会话被分配一个伪随机的秘密ID,该ID通常使用cookie在用户的浏览器中存储,例如SESSID=abcdef123456789。会话ID通常与包含会话数据的文件名匹配。

会话通常具有短暂的生命周期,并且如果一段时间未使用(约20分钟),则会自动删除。

通常在会话中存储的信息:

  • 当前登录用户的ID
  • 购物车
  • ...您能想到的任何可以在会话过期时安全删除的内容

示例

假设我第一次访问一个网站。该网站检测到我没有发送会话cookie,因此为我创建了一个会话。它在服务器上创建一个会话文件,例如/tmp/sess_abcdef123456789

然后它将带有包含网页的HTTP响应的cookie标头发送:

HTTP/1.1 200 OK
Set-Cookie: SESSID=abcdef123456789

我的浏览器存储了这个cookie。如果我访问同一服务器上的另一页,我的浏览器将在请求中发送此cookie:

GET /cart HTTP/1.1
Cookie: SESSID=abcdef123456789

当服务器接收到第二个请求时,可以检查是否存在此ID的会话文件,并使用它来检索会话数据。

您的web编程语言将支持会话,并应为您处理大部分复杂性。您通常可以直接使用会话数组/对象,其中已经填充了与访问您网站的用户相关的会话数据,如果您更新会话数据,它们将自动保存;这对您来说应该是完全透明的。

安全

在向您的网站登录用户时,始终将用户ID存储在会话中。 不要相信存储在cookie中的用户ID以加载用户数据。

很容易伪造cookie。如果基于存储在cookie中的用户ID加载用户信息,那么很容易更改此cookie中的用户ID以访问您网站上任何用户的帐户。

另一方面,如果将用户ID存储在会话中,该会话被分配了伪随机会话ID,则攻击者很难猜测当前分配给用户的会话ID。


会话通常很短暂,如果在一段时间内未使用(大约20分钟),则会自动删除。假设我使用Gmail帐户并关闭浏览器而没有注销,过了很长时间后再回来。它不会要求我重新登录。另一方面,如果我在使用Cpanel进行数据库操作时长时间不活动,它会自动退出登录。在这些情况下,会话如何发挥作用? - P Singh
1
我个人一直在为每个用户实现长期会话(“保持连接”复选框)而使用两个单独的会话:一个包含已登录用户ID、购物车等短期会话,以及仅包含用户ID的长期会话。首先,我检查短期会话是否存在用户ID。如果不存在,则检查长期会话,如果存在用户ID,则通过将用户ID复制到短期会话中再次登录用户。这样,我不会永久保留诸如购物车之类的临时数据,但我确实会长时间保留用户ID。 - BenMorel
很酷。谢谢你的想法,我将来可能会用到它。 - P Singh
顺便说一下,我刚刚在我的答案中添加了一些有关登录安全性方面的考虑。 - BenMorel
@Benjamin,我们能聊一下吗?我有一些疑问。 - Suraj Jain
显示剩余11条评论

2
我找到了这个链接,它解释了cookie和session在持久性和负载均衡服务器方面的关系。基本上讲,如果你的会话与一个服务器相关联并且你被重定向了,cookie将存储相关会话信息,如会话ID,以便您在所有服务器上都可以保持持久性。该链接比我能做得更好地解释了这个问题。
链接:https://devcentral.f5.com/articles/sessions-and-cookies-and-persistence-oh-my#.UdPNRGfYhOY

熟悉一个新术语“持久化”。 - P Singh
是的,持久性、负载均衡、会话和Cookies都是相关的。你应该经常遇到这些术语。 - KNN. T
我明白了。仍在学习相关的各种概念。 - P Singh

1

会话(Session)与 Cookie 不同,它将数据存储在服务器上。但是,会话信息存储在用户的 Cookie 中。

会话使用 Cookie 在用户浏览器中存储有关自己的信息。例如,Cookie SSID 包含一个会话标识符,服务器将根据此标识符了解与该用户绑定的会话类型。


我不理解这句话的意思 - “服务器将了解与此用户绑定的会话类型”,是否有为用户创建的会话类型?如果有,它们是什么? - P Singh
服务器根据与会话cookie相关联的实现方式来确定自己。会话本身存储在内存或磁盘上(这也取决于实现方式)。当向服务器发送请求时,它从请求中获取所需的cookie并将其绑定到现有会话。如果没有,则创建一个新的会话。 - Cobalt
需要设置cookies吗? - P Singh
服务器自己做 - Cobalt

1
COOKIE 存储在客户端,即浏览器中。COOKIE 会随请求自动传递到服务器,服务器使用 COOKIE 获取为该客户端存储的任何 SESSION 数据。

这是否意味着会话数据存储在一个cookie/cookie文件中? - P Singh
不,通常Cookie包含Session ID。会话数据将存储在服务器上。 - Andreas Skötte
好的,现在很清楚了。谢谢。 - P Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接