Cookie与会话

时间:2011-06-06 14:36:26

标签: php session cookies

几个月前我开始使用PHP。为了为我的网站创建登录系统,我阅读了有关cookie和会话及其差异的信息(cookie存储在用户的浏览器和服务器上的会话中)。那时候,我更喜欢饼干(谁不喜欢饼干?!)并且只是说:“谁在乎?我没有任何好处将它存储在我的服务器中”,所以,我继续使用cookies我的学士毕业设计。然而,在完成我的应用程序的重要部分之后,我听说对于存储用户ID的特定情况,会话更合适。所以我开始考虑如果陪审团问我为什么用饼干代替会话,我会怎么说?我有这个原因(我不需要存储有关用户的内部信息)。那是否足够?还是不止于此?
您能否告诉我使用cookies保存用户ID的优缺点?

感谢StackOverflow中的所有人!

15 个答案:

答案 0 :(得分:199)

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

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

编辑:除了简单性之外,我认为使用cookie没有任何好处。以这种方式看待它......用户是否有任何理由知道他们的ID#?通常我会说不,用户不需要这些信息。提供信息应限于需要知道的基础。如果用户将其Cookie更改为具有不同的ID,您的应用程序将如何响应该怎么办?这是一个安全风险。

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

答案 1 :(得分:108)

区分这两者的基本思路。

<强>会话

  1. IDU存储在服务器(即服务器端)
  2. 更安全(因为1)
  3. 无法设置过期,用户关闭浏览器时会话变量将过期。 (现在它在php中默认存储24分钟)
  4. <强>饼干:

    1. IDU存储在Web浏览器(即客户端)
    2. 不太安全,因为黑客可以访问并获取您的信息(因为1)
    3. 可以设置到期时间(有关详细信息,请参阅setcookies()
    4. 当您需要存储短期信息/值时,首选会话,例如计算,测量,查询等变量。

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

答案 2 :(得分:40)

SESSIONS ENDS WHEN USER CLOSES THEIR BROWSER,

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

这是您选择的主要区别,

如果您想长时间记住身份证,那么您需要使用cookies;否则,如果您只是希望网站能够识别此次访问的用户,那么会话即可。

会话存储在php服务器将生成的文件中。要记住哪个文件是针对哪个用户,php还会在用户的浏览器上设置一个cookie来保存这个会话文件ID,这样在下次访问时,php会读取该文件并重新加载会话。

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

值得注意的是,现在浏览器还支持另一种存储引擎,例如LocalStorage,SessionStorage和其他webdb引擎,javascript代码可以使用这些引擎将数据保存到您的计算机上以便记住您。例如,如果你在Facebook中打开javascript控制台,并输入“localStorage”,你将看到Facebook用来记住你的所有变量而没有cookie。

答案 3 :(得分:19)

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

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

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

答案 4 :(得分:12)

实际上,会话和cookie并不总是分开的。通常,但并非总是如此,会话使用cookie。

在这些其他问题中,您的问题有一些很好的答案。由于您的问题专门是关于保存用户的IDU(或ID),我不认为这与其他问题完全重复,但他们的答案应该对您有帮助。

cookies vs session

Cache VS Session VS cookies?

What is the difference between a Session and a Cookie?

答案 5 :(得分:8)

我个人同时使用cookies和会话。

Cookie仅在用户点击“记住我”复选框时使用。此外,服务器上的Cookie 已加密且数据仅已解密。如果有人试图编辑cookie,我们的解密器就能检测到它并拒绝请求。

我见过很多网站,其中登录信息存储在Cookie中,任何人只需将用户在Cookie中的ID和用户名更改为访问任何人的帐户。

谢谢,

答案 6 :(得分:5)

简短答案

按优先级排序的规则:

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

详细答案

饼干

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

会话

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

适当的选择

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

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

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

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

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

  • 如果答案为,请使用 cookies
  • 如果答案为,请使用会话

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

答案 7 :(得分:2)

会话和Cookie不一样。

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

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

致谢:Session and Cookie

答案 8 :(得分:2)

TL; DR

+--------------------------------------------------+---------------------------------+------------------------------------------------------------+
| Criteria / factors                               | Sessions                        | Cookies                                                    |
+--------------------------------------------------+---------------------------------+------------------------------------------------------------+
| Epoch (start of existence)                       | Created BEFORE an HTTP response | Created AFTER an HTTP response                             |
| Availability during the first HTTP request       | YES                             | NO                                                         |
| Availability during the succeeding HTTP requests | YES                             | YES                                                        |
| Ultimate control for the data and expiration     | Server administrator            | End-user                                                   |
| Default expiration                               | Expires earlier than cookies    | Lasts longer than sessions                                 |
| Server costs                                     | Memory                          | Memory                                                     |
| Network costs                                    | None                            | Unnecessary extra bits                                     | 
| Browser costs                                    | None                            | Memory                                                     |
| Security                                         | Difficult to hijack             | Easy to hijack                                             |
| Deprecation                                      | None                            | Now discouraged in favor of the JavaScript "Web Storage"   |
+--------------------------------------------------+---------------------------------+------------------------------------------------------------+

详细信息

优点和缺点是主观的。它们可能导致二分法(对某些人来说是优点,但对另一些人来说则是缺点)。相反,我在上面列出了可以帮助您决定选择哪个因素的因素。

第一个HTTP请求和响应过程中的存在

让我们说您是一个服务器端人员,希望同时处理会话和cookie。第一次HTTP握手将像这样:

  1. 浏览器准备 HTTP请求-会话:不可用; COOKIES:不可用
  2. 浏览器发送HTTP请求
  3. 服务器收到HTTP请求
  4. 服务器处理 HTTP请求-会话:已存在; COOKIES:播放
  5. 服务器发送HTTP响应
  6. 浏览器收到HTTP响应
  7. 浏览器处理 HTTP响应-会话:不可用; COOKIES:存在

在步骤1中,浏览器不知道会话和cookie的内容。 在第4步中,服务器可以设置会话和cookie的值。

后续HTTP请求和响应期间的可用性

  1. 浏览器准备 HTTP请求-会话:不可用; COOKIES:可用
  2. 浏览器发送HTTP请求
  3. 服务器收到HTTP请求
  4. 服务器处理 HTTP请求-会话:可用; COOKIES:可用
  5. 服务器发送HTTP响应
  6. 浏览器收到HTTP响应
  7. 浏览器处理 HTTP响应-会话:不可用; COOKIES:可用

有效载荷

比方说,在一个网页中,您正在加载example.com托管的20个资源,这20个资源将携带有关cookie的额外信息。即使只是对CSS或JPG图像的资源请求,它仍会在前往服务器的方式的标头中携带cookie。对JPG资源的HTTP请求是否应该包含一堆不必要的Cookie?

弃用

无法替代会话。但是there are many other options是在浏览器而不是old school cookies中存储数据。

用户数据的存储

会话对于存储用户数据更为安全,因为最终用户无法修改会话,而只能在服务器端进行设置。 Cookies on the other hand can be hijacked,因为它们只是存储在浏览器中。

答案 9 :(得分:1)

会话允许您像使用cookie一样存储单个信息,但数据存储在服务器而不是客户端。

答案 10 :(得分:0)

正如其他人所说,Sessions很聪明,更有利于隐藏客户信息。

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

Cookie和会话用于存储信息。 Cookie仅存储在客户端计算机上,而会话存储在客户端和服务器上。

会话

会话在服务器上的临时目录中创建一个文件,该目录中存储了已注册的会话变量及其值。在访问期间,该数据将可用于网站上的所有页面。

当用户关闭浏览器或离开网站后,会话结束,服务器将在预定的时间段(通常为30分钟)后终止会话。

饼干

Cookie是存储在客户端计算机上的文本文件,并且保留使用跟踪的目的。服务器脚本将一组cookie发送到浏览器。例如名称,年龄或标识号等。浏览器将此信息存储在本地计算机上,以备将来使用。

下次浏览器向Web服务器发送任何请求时,浏览器将这些cookie信息发送至服务器,服务器使用该信息来识别用户。

答案 14 :(得分:0)

SessionCookie 之间的主要区别在于 Session 数据存储在服务器上,而 Cookies em> 在访问者的浏览器中存储数据。

SessionsCookies 更安全,因为它存储在服务器中。

存储在 Cookie 中的数据可以存储数月或数年,具体取决于 Cookie 的寿命。但是当关闭网页浏览器时,Session 中的数据就会丢失。