PHP会话和Cookie的目的及其差异

时间:2011-04-09 23:57:44

标签: php session cookies session-cookies httpcookie

我刚刚开始学习用PHP编程,并遇到了一个有点混乱的领域,Sessions和Cookies。

我理解服务器端和客户端存储差异,但我不知道它们如何区分以及在哪种情况下适合它们?

另外,我看到有人说cookie可用于存储会话ID,如何做到这一点以及为什么这会有利?

感谢您的反馈。

3 个答案:

答案 0 :(得分:3)

首先,让我们破坏长期存在的神话(或者至少我认为这是一个现存的神话)会话cookie与常规cookie不同。它不是。会话cookie只是一个常规cookie。只有设置(或者不设置)的会话cookie的属性通常是不同的。但机制完全一样。

通过向浏览器发送http响应标头来设置cookie:

Set-Cookie: name=value[; possible expiration-date][; other possible properties]

通常将会话cookie与常规cookie区分开来的是没有设置过期日期(或过期日期设置为过去的日期)。这意味着浏览器将在关闭浏览器后处理cookie。但是,“常规”cookie也可以做到这一点。因此可以说它是一个“会话cookie”。

现在我们已经把它排除在外了;应用程序通常使用cookie来使它们充当会话cookie的机制,除了上述属性之外,cookie的值仅包含某种可识别的唯一值。也许md5可能是sha1哈希。

每次浏览器在服务器上请求资源时,它都会沿着这个cookie发送(除非它已经过期),并带有这样的http请求标头:

Cookie: name=value

后端的会话机制(在您的情况下是PHP)将cookie的唯一ID与存储在服务器文件系统中的文件中的数据相链接,或者可能在数据库中。这样,每次收到cookie时,它都能够检索这些数据并将其链接到请求。

这样做的好处是,敏感信息1)可以隐藏而不必通过网络传播,2)不会在用户浏览器cookie缓存中结束,只需将其保留在服务器上即可。

因此,基本上您希望在常规cookie中发送非敏感且非应用程序至关重要的信息(想一想:布局首选项,非持续性播放列表,例如在YouTube上等),并使用用于存储敏感信息的会话。

修改
抱歉,忽略“或过期日期设置为过去的日期”,因为它是假的。这将导致cookie立即被浏览器无效,因此不再与请求一起发送。

答案 1 :(得分:1)

在会话中使用Cookie的好处是,Cookie 是持久的

换句话说,当用户几周后访问您的网站时,他们的会话很可能已过期。但是,如果他们有一个可以在脚本中唯一标识它们的cookie,那么您可以自动登录并重新建立会话。

  

......每种情况适合哪种情况?

答案看起来像这样:

  • 会话数据应包含不需要持久或仅在短时间内需要的信息。例如,如果您向用户呈现多页表单,则可以利用会话。
  • Cookie应用于存储ID或散列,该ID或散列不仅可以唯一标识用户,还可以标识他们登录的浏览器/设备。请记住,cookie数据不受您的控制,只能由用户发出的HTTP请求(或在某些情况下,通过页面上的脚本)进行操作/删除。
  

另外,我看到有人说cookie可用于存储会话ID ...

我假设这意味着在cookie中存储一个唯一值,用于标识他们正在使用的用户/浏览器/设备。实现这样的东西看起来像:

  • 让用户按正常方式登录。
  • 生成一个唯一的哈希值(SHA-1是您最好的选择)并将其存储在cookie中。您还将哈希存储在链接到该用户的数据库中。
  • ...
  • 用户在会话过期后返回并访问某个页面。
  • 您的脚本会看到Cookie并查找该哈希所属的用户。
  • 用户已登录。

答案 2 :(得分:0)

Cookie和会话都用于保存用户特定信息以跟踪用户。很多时候你可以使用其中任何一种,但它们有一些差异。

Cookie是保存在用户计算机上的文本文件。每次用户访问您的网站时,他都会移交Cookie,让您知道他是谁。这样做的好处是信息保存在别人的机器上,所以你不必担心它。因此,您可以将它留在那里直到奶牛回家。当用户回来时,他会带来他的信息。缺点是信息无法控制,因为用户可以轻松编辑您给他的cookie。这使得cookie中的任何信息都不值得信任,并且每次用户提供给您时都必须进行检查。

会话就像一个cookie,除非您将信息保存在服务器上。优点是您可以信任会话以保持数据与您放入数据时完全一样。缺点是您必须存储该信息,这意味着最终您需要丢弃它以免您的网络服务器填满信息永远不会被使用。

现在这是一个有点棘手的地方。您看到会话的机制如上所述,实际的实现可能会因PHP的设置而异。会话数据可以保存在单个文本文件中,也可以保存在服务器上的数据库中。您还需要一些方法来识别哪个会话对应于哪个用户。通常(但不仅仅是)这样做的方法是使用cookie。会发生什么是实际数据保留在您的服务器上并链接到唯一的会话ID。该会话ID号被放在一个cookie上并提供给用户,以便以后可以在他回来时查找他的数据。

当您使用会话功能时,PHP会自动执行上述过程;你不需要手工实现它。如果由于某种原因您需要更改会话的实现方式,您可以通过更改php.ini中的会话参数来实现。