【问题标题】:Relation between sessions and cookies [closed]会话和 cookie 之间的关系 [关闭]
【发布时间】:2015-12-10 08:41:51
【问题描述】:

我了解了SESSION 和COOKIE 之间的区别,但我正在尝试找出两者之间的关系。我检查了多个站点,但无法获得相关答案并感到困惑。 cookie 是在用户的浏览器还是系统上生成的?有人说它是在系统上生成的,而其他一些链接说它们是在用户的浏览器上创建的。会话也以 cookie 或 cookie 文件的形式保存。这是真的吗?

【问题讨论】:

标签: session cookies


【解决方案1】:

Cookie

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

当您的浏览器接收到一个 cookie 时,它​​会存储它,并将它与它在同一网站上发出的每个后续请求一起发送回服务器。

因为 cookie 是 HTTP 请求和响应标头的一部分,所以它们的大小有所限制。

cookies 中存储的典型信息:

  • 会话 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的会话文件,并使用它来检索会话数据。

您的网络编程语言将为会话提供支持,并且应该为您处理大部分复杂性。您通常可以直接使用会话数组/对象,该数组/对象已经填充了会话数据特定于访问您网站的用户,并且如果您更新会话数据,则会自动保存;这对你来说应该是完全透明的。

安全

当用户登录到您的网站时,请始终将用户 ID 存储在会话中。 永远不要相信存储在 cookie 中的用户 ID 来加载用户数据。

伪造 cookie 非常容易。如果您要根据存储在 cookie 中的用户 ID 加载用户信息,则可以轻松更改此 cookie 中的用户 ID 以访问您网站上的任何用户帐户。

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

【讨论】:

  • "会话通常是短暂的,如果有一段时间(20 分钟左右)未使用,则会自动删除。"假设我正在使用 gmail 帐户并关闭浏览器而不注销,很长一段时间后再回来。它不会要求我再次登录。另一方面,如果我将 Cpanel 用于数据库目的,并且如果我在一段时间内不活动,它会自动注销。在这种情况下,会话如何发挥作用?
  • 我只能强调通常:没有什么能阻止您编写一个长期存在的会话处理程序,Gmail 可能以某种方式正在这样做。 OTOH,Cpanel 可能使用了一个典型的、短暂的会话处理程序,带有一个垃圾收集器,可以自动清理超过 20 分钟未使用的会话。这是您使用框架编程语言开箱即用的会话。
  • 我个人一直在为每个用户实现两个单独的会话的长期会话(“保持连接”复选框):一个包含登录用户 ID、购物车、等等,以及只包含用户 ID 的长期会话。如果存在用户 ID,我首先检查短期会话。如果不是,则检查长期会话,如果存在用户 ID,则通过将用户 ID 复制到短期会话中来再次登录用户。这样一来,我就不会永远保留购物车等临时数据,而是会长期保留用户 ID。
  • 很酷。感谢您的想法,我将来可能会使用它。
  • @PSingh 顺便说一句,我刚刚在我的答案中添加了一些有关登录的安全注意事项。
【解决方案2】:

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

【讨论】:

  • 这是否意味着会话数据存储在 cookie/cookie 文件中?
  • 不,通常 cookie 包含会话 ID。会话数据将存储在服务器上。
  • 好的,现在很清楚了。谢谢。
【解决方案3】:

我发现这个链接解释了关于持久性和负载平衡服务器的 cookie 和会话之间的关系。它基本上讨论了如果您的会话与一台服务器有关并且您被重定向,cookie 将存储相关的会话信息,例如会话 ID,以便您可以在所有服务器上保持持久性。

https://devcentral.f5.com/articles/sessions-and-cookies-and-persistence-oh-my#.UdPNRGfYhOY

这个链接解释得比我好很多。

【讨论】:

  • 熟悉一个新术语“持久性”
  • 是的,持久性、负载平衡、会话和cookies都是相关的。您应该经常遇到这些术语。
  • 我明白了。还在学习这方面的各种概念。
【解决方案4】:

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

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

【讨论】:

  • 我不明白这一点-“服务器将了解与该用户相关联的会话类型”,是否有为用户创建的会话类型?如果是,它们是什么?
  • 服务器,取决于realizaii自己与会话cookie相关联。会话本身存储在内存或磁盘上(也取决于实现)。当向服务器发出请求时,他从请求中获取所需的 cookie 并绑定她现有的会话。如果没有,它会创建一个新的。
  • 必须设置cookies吗?
  • 服务器自己做
猜你喜欢
  • 2021-12-28
  • 2017-10-03
  • 2013-07-06
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多