Session 和 Cookie 之间的区别

Session 和 Cookie 的主要区别

  • Session 是包含用户信息的服务器端文件,而 Cookie 是包含用户信息的客户端文件。
  • Session 依赖于 Cookie,但 Cookie 不依赖于 Session。
  • 当用户关闭浏览器时,Session 就会结束,而 Cookie 会根据您为其设置的生命周期过期。
  • 您可以在 Session 中存储任意数量的数据,但 Cookie 的数据存储空间仅为 4KB。
  • Session 中注册的所有数据都可以使用 Session_destroy() 命令销毁。但是,没有像 unsetcookie() 这样的命令可以从 cookie 中删除数据。  

Difference between Session and Cookies
Session 和 Cookie 之间的区别

在这里,我分析了 Session 和 Cookie 之间的区别,并将全面评估它们的优缺点。

什么是 Session?

Session 是存储在服务器上的全局变量。每个 Session 都有一个唯一的 ID,用于检索存储的值。每当创建一个 Session 时,一个包含唯一 Session ID 的 Cookie 就会存储在用户的计算机上,并随着每次请求发送回服务器。如果客户端浏览器不支持 Cookie,则唯一的 Session ID 会显示在 URL 中。与 Cookie 相比,Session 可以存储相对大量的数据。

当浏览器关闭时,Session 值会自动删除。如果要永久存储值,则应将其存储在 数据库中。

与 $_COOKIE 数组变量一样,Session 变量存储在 $_SESSION 数组变量中。与 Cookie 类似,必须在任何 HTML 标签之前启动 Session。

为什么以及何时应该使用 Session?

Session 用于将值从一个页面传递到另一个页面。它们更安全地将用户 ID 等重要信息存储在服务器上,以免被恶意用户篡改。

当您需要一个替代 Cookie 的方案来处理不支持 Cookie 的浏览器时,也可以使用它,以更有效、更安全的方式存储全局变量。这比在 URL 中传递它们,或者在开发购物车等需要临时存储容量大于 4KB 的信息时要好。

使用 PHP 创建 Session

要开始一个 Session,您需要在 PHP 中启动 session_start 函数,然后将您的值保存在 $_SESSION 超全局数组中。

考虑您想跟踪页面访问频率的情况。利用 Session 是实现此目的的有效方法。

以下示例演示了如何建立和访问 Session 中的值

<?php

session_start(); //start the PHP_session function 

if(isset($_SESSION['page_count']))
{
     $_SESSION['page_count'] += 1;
}
else
{
     $_SESSION['page_count'] = 1;
}
 echo 'You are visitor number ' . $_SESSION['page_count'];

?>
输出
You are visitor number 1

Session 的优点

以下是我认为的 Session 的优点。

  • 通过在多个请求中维护连续的对话状态来增强用户交互。
  • 通过临时存储用户数据来减少服务器负载。
  • 通过控制有限时间的数据暴露来提高安全性。
  • 允许基于用户行为和偏好进行个性化体验。
  • 通过跟踪多个步骤来促进复杂事务。
  • 通过最小化重新认证的需求来提高网站性能。
  • 通过在分布式系统中有效管理用户会话来支持可扩展性。

Session 的缺点

根据我的经验,这些是使用 Session 的缺点。

  • 如果 Session 数据被截获,会增加数据泄露的风险。
  • 消耗服务器内存,可能降低整体系统性能。
  • 如果管理不当,可能导致用户体验不一致。
  • 需要额外的服务器资源来维护和监控会话。
  • Session 过期可能会中断用户活动,导致用户感到沮丧。
  • 容易受到 Session 劫持和固定攻击。
  • 由于持久数据存储,可能会使符合隐私法规变得复杂。

什么是 Cookie?

Cookie 是一个最大尺寸为 4KB 的小文件,Web 服务器将其存储在客户端计算机上。一旦设置了 Cookie,所有后续的页面请求都会返回 Cookie 的名称和值。Cookie 只能从为其颁发的域读取。例如,使用域 www.guru99.com 设置的 Cookie 无法从域 career.guru99.com 读取。互联网上大多数网站都会显示来自其他域的元素,例如广告。服务这些元素的域也可以设置自己的 Cookie。这些被称为第三方 Cookie。用户创建的 Cookie 只能对他们可见。其他用户无法看到其值。大多数 Web 浏览器都有禁用 Cookie、第三方 Cookie 或两者都禁用的选项。

为什么以及何时应该使用 Cookie?

HTTP 是一个无状态协议;Cookie 允许我们通过存储在用户计算机上的小文件来跟踪应用程序的状态。存储 Cookie 的路径取决于浏览器。Internet Explorer 通常将它们存储在“临时 Internet 文件”文件夹中。

个性化用户体验:这可以通过允许用户选择他们的偏好来实现。随后的页面请求会根据 Cookie 中设置的偏好进行个性化。跟踪用户访问的页面。

使用 PHP 创建 Cookie

现在,让我们深入了解 Cookie 创建所需的基本语法。

<?php

setcookie(cookie_name, cookie_value, [expiry_time], [cookie_path], [domain], [secure], [httponly]);

?>
  • 在 PHP 中,使用 setcookie 函数来生成 Cookie。“cookie_name”代表 Cookie 的标识符,当服务器需要从 $_COOKIE 数组中获取 Cookie 的值时,它至关重要。此名称是必需的。
  • “cookie_value”表示 Cookie 的内容,也是必需的。
  • “[expiry_time]”参数是可选的,可以设置以确定 Cookie 的生命周期,例如将其设置为在 1 小时后过期。这是通过将秒添加到 PHP time() 函数或从中减去来实现的,例如,time() + 3600 设置为 1 小时。
  • “[cookie_path]”是另一个可选参数,用于确定 Cookie 可访问的服务器路径。使用斜杠“/”表示 Cookie 在整个域中可用,而指定子目录则将访问限制在这些子域中。
  • “[domain]”参数也是可选的,用于建立 Cookie 的可访问位置。例如,将其设置为 www.cookiedomain.com 将使其在整个域中可用,而 www.sub.cookiedomain.com 则将其限制在该子域及其子子域中。请记住,子域也可以拥有自己的子域,只要域的总长度不超过 253 个字符。
  • “[secure]”参数是可选的,其默认设置为 false。它指定 Cookie 是否应通过 HTTPS(如果为 true)或 HTTP(如果为 false)传输。
  • “[Httponly]”设置也是可选的。当设置为 true 时,Cookie 不能被客户端脚本语言(如 JavaScript)访问。

注意:PHP setcookie 函数必须在任何 HTML 标记输出之前调用。

让我们来看一个涉及 Cookie 的实际示例。

在本例中,我们将开发一个简单的程序,将用户名存储在将在十秒后过期的 Cookie 中。

以下“cookies.php”代码演示了如何实现此功能。

<?php
     setcookie("user_name", "Guru99", time() + 60,'/'); // expires after 60 seconds
     echo 'the cookie has been set for 60 seconds';
?>
输出
the cookie has been set for 60 seconds

Cookie 的优点

根据我的经验,这是 Cookie 的优点。

  • 增强风味探索的惊喜元素。
  • 提供极简主义美学,非常适合现代品牌。
  • 减少包装混乱,将注意力集中在产品上。
  • 消除基于食材偏好或品牌认知的偏见。
  • 鼓励在没有先入为主观念的情况下品尝,从而获得无偏见的反馈。
  • 可能降低包装的印刷成本。
  • 简化了在标签要求不太严格的市场中的法规遵从性。

Cookie 的缺点

根据我所见,这些是 Cookie 的缺点。

  • 客户无法识别过敏原或饮食限制。
  • 缺少营养信息,这对注重健康的消费者来说很重要。
  • 错过了突出独特或优质食材的机会。
  • 可能会在货架上的相似产品之间造成混淆。
  • 阻碍品牌认知和忠诚度建立。
  • 有损于知情的消费者决策。
  • 在标签严格的地区,这可能导致法律问题。

Session 与 Cookie:它们之间的区别

根据我的实践,以下是我观察到的 Session 和 Cookie 之间的一些重要区别。

Session vs Cookie
Session vs Cookie

Session
Cookie

Session 是包含用户信息的服务器端文件

Cookie 是包含用户信息的客户端文件

用户关闭浏览器时,Session 即结束

Cookie 根据您为其设置的生命周期而结束

PHP 中,在使用 $_SESSION 之前,您必须编写 session_start(); 其他语言也类似。

您无需启动 Cookie,因为它存储在您的本地计算机上。

在 Session 中,您可以根据需要存储任意数量的数据。您可能达到的唯一限制是脚本一次可以消耗的最大内存,默认情况下为 128MB。

官方的最大 Cookie 大小为 4KB。

Session 依赖于 Cookie

Cookie 不依赖于 Session

Session_destroy() 用于销毁所有注册数据或取消设置某些数据。

没有名为 unsetcookie() 的函数。

结论

我建议在数据安全性和容量要求超出 Cookie 所能提供的范围时使用 Session。然而,在易用性和实现轻量级、持久的用户状态跟踪方面,Cookie 是无与伦比的。