Cookie与会话


188

我几个月前开始使用PHP。为了为我的网站创建一个登录系统,我阅读了有关cookie和会话及其区别(cookie存储在用户的浏览器中以及服务器上的会话中)的信息。那时,我更喜欢cookie(谁不喜欢cookie ?!),只是说:“谁在乎?我将它存储在服务器中并没有什么好处”,所以,我继续使用cookie我的学士毕业项目。但是,在完成我的应用程序的大部分之后,我听说对于存储用户ID的特定情况,会话更为合适。因此,我开始考虑如果陪审团问我为什么要使用Cookie而不是会议?我有这个理由(我不需要在内部存储有关用户的信息)。?还是不止于此?
您能告诉我使用Cookie保留用户ID的优缺点吗?

谢谢大家在StackOverflow中!


2
两种方法都存储数据。Cookies在客户端(即访问者设备的存储空间)上进行。会话是一个聪明的“扩展”,因为它们仅在客户端存储唯一的ID,而在服务器端存储所有实际数据。当他们从客户端的cookie中接收到唯一ID时,他们便知道要在服务器上加载哪些数据。在大多数情况下,会话将是您所需要的。顺便说一下,您可以使用更现代的方式使用github.com/delight-im/PHP-Cookie进行管理。
caw

顺便说一句,几年前WordPress核心放弃了会话的使用,而现在使用cookie。有趣。我想知道他们是否这样做,以便更轻松地在一组负载平衡的服务器上进行部署和/或减少由于会话垃圾收集而导致的随机注销。
西蒙东

Answers:


229

该概念是为Web访问者跨页面加载存储持久性数据。Cookies将其直接存储在客户端上。会话使用cookie作为排序键,以与存储在服务器端的数据相关联。

最好使用会话,因为实际值对客户端是隐藏的,并且您可以控制数据何时到期并变为无效。如果全部基于cookie,则用户(或黑客)可以操纵其cookie数据,然后向您的站点播放请求。

编辑:我认为使用cookie除了简单之外没有任何优势。这样看吧...用户是否有任何理由知道其ID#?通常,我会说不,用户不需要此信息。提供信息应基于需要的了解而受到限制。如果用户将其Cookie更改为具有不同的ID怎么办,您的应用程序将如何响应?这是安全隐患。

在会议风靡一时之前,我基本上有自己的实现。我在客户端上存储了一个唯一的cookie值,并将我的持久数据与该cookie值一起存储在数据库中。然后在页面请求中,我匹配了这些值并拥有了我的持久数据,而没有让客户端控制它是什么。


29
@JiminyCricket我不认为这是真的...如果是这样,没有人会使用会话变量来存储当前登录的用户-每个人都会这样做。这将是巨大的安全风险。可以肯定的是,通常会话ID是作为cookie存储在客户端计算机上的,然后与会话数据在服务器端进行匹配。服务器通常不通过IP地址,而是通过cookie值来控制会话。
John M.

1
我最近刚开始只使用cookie,这纯粹是因为如果同一会话中当前正在执行另一个页面,那么会话会使页面无法加载,除非您session_write_close();在需要时在每个页面前都添加了它们。滚动自己的唯一ID并与纯Cookie匹配并不难,并且可以使所有页面保持美观和活泼。
Brian Leishman

您认为我应该使用会话进行身份验证吗?有安全隐患吗?黑客如何尝试更改其会话ID,服务器将如何响应(假设猜测的会话ID有效)?
O-BL

使用会话,然后使用2FA,因为会话可以被劫持。
Zakir Sajib

119

区分这两个基本概念。

会议:

  1. IDU存储在服务器(即服务器端)上
  2. 更安全(因为1)
  3. 无法设置过期时间,当用户关闭浏览器时,会话变量将过期。(如今,它默认存储在php中24分钟)

饼干:

  1. IDU存储在Web浏览器(即客户端)中
  2. 不太安全,因为黑客可以到达并获取您的信息(因为1)
  3. 可以设置过期时间(有关更多信息,请参见setcookies()

当您需要存储短期信息/值(例如用于计算,测量,查询等的变量)时,首选会话。

当您需要存储长期信息/值(例如用户帐户)时,首选使用Cookie(这样,即使他们将计算机关闭2天,其帐户仍将登录)。我想不出很多Cookie的示例,因为在大多数情况下都没有采用它。


6
请注意:这不是一个好答案。它开始还不错,但使事情变得混乱,并以虚假信息告终。这不是会话与Cookie的说明。这是会话与会话+会话Cookie的说明。由于陈述的原因,单独使用cookie并不是首选。出于上述原因,首选会话+会话cookie。
markus

另一个错误是您确实通过PHP配置影响了会话生存期。
markus

1
会话仍在用户浏览器上设置cookie,因此此服务器-客户端说明不正确
Zalaboza

会话到期可以通过任何应用程序轻松设置。第三点是错误的。另外,您忘记了Cookie和会话中可以存储的数据量。那是更重要的一点
saran3h '18

1
IDU代表什么?
西蒙东

44
SESSIONS ENDS WHEN USER CLOSES THEIR BROWSER,

COOKIES END DEPENDING ON THE LIFETIME YOU SET FOR IT. SO THEY CAN LAST FOR YEARS

这是您选择的主要区别,

如果您希望长时间记住该ID,则需要使用Cookie。否则,如果您只想让网站识别此访问的用户,那么就可以使用会话。

会话存储在您的php服务器将生成的文件中。为了记住哪个用户的文件,php还将在用户的浏览器上设置一个cookie,该cookie持有该会话文件的id,因此在他们下次访问时php将读取该文件并重新加载会话。

现在,php默认情况下会在每个间隔清除会话,并且会话的命名约定也会使其自动过期。此外,一旦关闭浏览器或清除历史记录,浏览器将不会保留保存会话ID的cookie。

重要的是要注意,当今的浏览器还支持另一种存储引擎,例如LocalStorage,SessionStorage和其他webdb引擎,JavaScript代码可使用这些引擎将数据保存到您的计算机以记住您。例如,如果您在Facebook内部打开JavaScript控制台,然后键入“ localStorage”,您将看到Facebook用于记住您的所有变量而没有cookie。


16
实际上,默认情况下,会话会持续到用户关闭浏览器为止,但是可以通过将session.cookie_lifetime = 0更改为您希望会话持续的秒数来更改php.ini文件中的值。使用session_set_cookie_params()。
DOK

1
更多有用的信息,例如得到很多答案的问题..很好,再次感谢!
Nadjib Mami 2011年

1
还请记住,可以创建故障会话文件的单点。即使通过代理,IP切换器或僵尸进行最小的Dos风格攻击,也会在服务器硬盘或ssd上创建会话文件。如果您跟不上读写操作,那么您的网站将会崩溃。
肖恩·卡特

任何人都可以赞叹:“会话在用户关闭浏览器时结束” 1.如果用户从页面导航awya,然后返回而不关闭浏览器,该怎么办。2.如果打开了多个指向同一站点的浏览器窗口/选项卡,该怎么办?在这种情况下,一些工作中的Web应用程序会感到困惑,但我不知道它们使用哪种类型的Cookie。
jcansell

1
@jcansell好,Cookie不会因多个选项卡或导航而混淆,在这种情况下,这些Web应用程序很可能使用了本地存储/会话存储来使用javascript保存数据
Zalaboza

20

当您将#ID保存为Cookie来识别已登录的用户时,实际上是向与他们无关的用户显示数据。此外,如果第三方尝试在其浏览器中将随机ID设置为cookie数据,则他们将能够说服服务器他们是用户,而实际上却不是。那是缺乏安全性。

您已经使用过cookie,并且正如您所说的,您已经完成了大部分项目。Cookie可以保留很长一段时间,而会话结束更快。因此,在这种情况下,会话不适合。实际上,许多著名和流行的网站和服务都使用cookie,因此您可以长时间保持登录状态。但是,您如何使用他们的方法来创建更安全的登录过程?

这是一个想法:可以帮助您使用cookie的方式:如果您使用随机密钥而不是ID来识别已登录的用户,首先,不要将主要数据泄露给随机用户,其次,如果您考虑使用Random,足够大的密钥,任何人都很难猜出密钥或创建随机密钥。例如,您可以在用户的​​浏览器中保存40个长度的密钥,例如:“ KUYTYRFU7987gJHFJ543JHBJHCF5645UYTUYJH54657jguthfn”,这样任何人都不太可能创建确切的密钥并假装成其他人。


1
很好的解释。我在令牌中使用GUID来识别单个用户。
Karthik

16

简短答案

按优先级排序的规则:

  • 规则1.永远不要相信用户的输入:Cookies是不安全的。将会话用于敏感数据。
  • 规则2。如果在用户关闭浏览器时必须保留持久性数据,请使用cookie。
  • 规则3.如果在用户关闭浏览器时不必保留持久性数据,请使用会话。
  • 规则4.阅读详细答案!

来源:https : //www.lucidar.me/en/web-dev/sessions-or-cookies/


详细答案

饼干

  • Cookies存储在客户端(在访问者的浏览器中)。
  • Cookie不安全:读取和写入Cookie内容非常容易。
  • 使用Cookie时,您必须根据欧洲法律(GDPR)通知访客。
  • 可以设置过期时间,但用户或浏览器可以更改它。
  • 用户(或浏览器)可以(设置为)拒绝使用cookie。

届会

  • 会话存储在服务器端。
  • 会话使用cookie(请参阅下文)。
  • 会话比cookie更为安全,但并非无懈可击。
  • 到期时间是在服务器配置中设置的(例如php.ini)。
  • 默认到期时间为24分钟或关闭浏览器时。
  • 当用户刷新或加载新页面时,将重置过期。
  • 用户(或浏览器)可以(设置为)拒绝使用cookie,因此拒绝会话。
  • 从法律上讲,您还必须通知访问者有关Cookie的信息,但尚无先例。

合适的选择

会话使用cookie!会话数据存储在服务器端,但是UID存储在客户端的cookie中。它允许服务器将给定的用户与正确的会话数据匹配。UID受保护且很难被黑客入侵,但并非无懈可击。对于敏感操作(更改电子邮件或重置密码),请不要依赖会话,也不要使用cookie:请要求用户输入密码以确认操作。

绝不应该将敏感数据存储在Cookie中(电子邮件,加密的密码,个人数据...)。请记住,数据存储在外部计算机上,如果该计算机不是私人计算机(教室或公共计算机),则其他人可能会读取Cookie内容。

记住我的数据必须存储在cookie中,否则当用户关闭浏览器时数据将丢失。但是,请勿将密码或用户个人数据保存在“记住我” cookie中。将用户数据存储在数据库中,并将此数据与存储在cookie中的一对ID /密钥加密在一起。

在考虑了先前的要求之后,以下问题最终是什么能帮助您在Cookie和会话之间进行选择:

用户关闭浏览器时是否必须保留持久性数据?

  • 如果答案是肯定的,请使用cookie
  • 如果答案是否定的,请使用会话


10

我个人使用cookie和会话。

Cookies仅在用户单击“记住我”复选框时使用。Cookie也被加密,并且仅在服务器上解密数据。如果有人尝试编辑Cookie,我们的解密器便能够检测到它并拒绝该请求。

我已经看到过很多将登录信息存储在cookie中的站点,任何人都可以简单地更改cookie中的用户ID和用户名来访问任何帐户。

谢谢,


2

会话和Cookie不同。

会话用于存储来自网页的信息。通常,网页没有任何存储器来存储这些信息。但是使用我们可以保存必要的信息。

但是Cookie用于识别用户。使用cookie,我们可以存储数据。它只是存储在用户Web浏览器中的一小部分数据。因此,每当用户下次浏览时,浏览器会将cookie数据信息发送回服务器以获取先前的活动。

学分:会话和Cookie


如果用户禁用了cookie,该怎么办?Cookie如何识别用户?
SohailRajput

1

会话使您可以像存储cookie一样存储一些单独的信​​息,但是数据将存储在服务器上而不是客户端上。


0

就像其他人所说的那样,会话很聪明,并且具有从客户端隐藏信息的更多优势。

但是Cookie至少还有一个优势,您可以从Javascript(例如ngCookies)访问Cookie 。使用PHP会话,您无法在PHP脚本之外的任何地方访问它。


1
您可以..当然不是直接地,但是您可以通过一些ajax请求访问返回会话数据的脚本来访问它。但是我不确定你应该怎么做。
l00k

0

我将选择“会话”,首先会话比cookie更为安全,cookie是客户端站点数据,会话是服务器站点数据。Cookies用于识别用户,因为它是随用户计算机浏览器一起嵌入在服务器中的一小段代码。另一方面,会话可帮助您保护身份,因为Web服务器不知道您是谁,因为HTTP地址将状态192.168.0.1更改为765487cf34ert8ded…..或其他借助GET和POST方法编号的数字。会话将用户的数据存储在唯一的ID会话中,即使用户ID也无法匹配。会话将单个用户信息存储在一个应用程序的所有页面中。Cookie过期是通过setcookies()来设置的,而会话过期未设置是当用户关闭浏览器时过期。


0

会话是服务器上与cookie信息相关联的一组信息。如果您使用的是PHP,则可以检查会话。保存_路径位置,并实际上“查看会话”。Cookie是发送给客户端和从客户端返回的数据的摘要。Cookies通常用于促进会话,因为它告诉服务器哪个客户端处理了哪个会话。还有其他方法可以做到这一点(查询字符串魔术等),但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.