会话和 cookie 之间的关系 [关闭]
Posted
技术标签:
【中文标题】会话和 cookie 之间的关系 [关闭]【英文标题】:Relation between sessions and cookies [closed] 【发布时间】:2015-12-10 08:41:51 【问题描述】:我了解了SESSION
和COOKIE
之间的区别,但我正在尝试找出两者之间的关系。我检查了多个站点,但无法获得相关答案并感到困惑。 cookie 是在用户的浏览器还是系统上生成的?有人说它是在系统上生成的,而其他一些链接说它们是在用户的浏览器上创建的。会话也以 cookie 或 cookie 文件的形式保存。这是真的吗?
【问题讨论】:
另见:What is the difference between Sessions and Cookies in php? 请注意,同样的概念适用于任何编程语言。 【参考方案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吗? 服务器自己做以上是关于会话和 cookie 之间的关系 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Cookiesession和localStorage以及sessionStorage之间的区别
使用 cookie/会话存储用户名、密码 - Java Servlets [关闭]