PHP中的Sessions和Cookies之间有什么区别?


Answers:


103

Cookie是浏览器存储的一点数据,并随每个请求发送到服务器。

会话是存储在服务器上并与给定用户相关联的数据的集合(通常通过包含ID码的Cookie)


@Quentin :) cookie也可以存储在会话中吗?
严峻的

3
连接关闭后,会话值也会重置。Cookies值通常会保存。
BadSkillz 2011年

@poter —如果一条数据存储在服务器上,那么浏览器就不会存储它(数据副本无法使用),因此不能,您不能在会话中存储cookie。
昆汀

1
@BadSkillz-不。通常,经过一段时间后,会话值将被重置,而没有与会话相关联的客户端进行连接。Cookie值会一直保存到有效期为止(如果未设置Cookie,则浏览器将关闭)。过期立即覆盖可用于两者。
昆汀

@Quentin :),但是当我们再次打开浏览器时,它仍然保留已保存的Cookie
严峻

54

Cookies用于识别会话。访问任何使用Cookie的网站,并打开Chrome检查元素,然后打开网络或FireBug(如果使用Firefox)。

您会看到有一个发送到服务器的标头,也收到了一个名为Cookie的标头。通常,它包含一些个人信息(例如ID),可以在服务器上使用该个人信息来标识会话。这些cookie保留在您的计算机上,您的浏览器负责将其仅发送到使用它标识的域。

如果没有cookie,那么您将通过GET或POST在每个请求上发送唯一的ID。Cookies就像静态ID一样,会在您的计算机上保留一段时间。

是一组与该cookie信息相关的服务器上的信息。如果您使用的是PHP,则可以检查session.save_path的位置并实际“查看会话”。它们是服务器文件系统上的文件,也可以是数据库中的文件。

Screenshot of a Cookie


指向Firebug和chrome开发工具的其他说明。
Dhawan Gayash

我丢失了有关会话的信息,并且cookie处于活动状态,这导致应用程序出错,为什么维护会话的最佳方法是什么?我在会话上存储数据,但是laravel maintan用户通过cookie登录,会话上的数据不见了。我能做什么或阅读?
鲁宾·鲁伊斯(RubenRuíz)

(上Laravel框架通,这是我的麻烦)
鲁本·鲁伊斯

会话与将内容存储在数据库中不同吗?
Suraj Jain

在大多数情况下,会话数据通常存储在磁盘上的某个位置。因此,对于Apache和PHP,它存储在系统temp文件夹中,或者您可以将其配置为存储在其他位置。即使在数据库中!
toomasr

15

会话和cookie之间的主要区别是会话数据存储在服务器上,而cookie将数据存储在访问者的浏览器中。

会话比cookie更安全,因为它存储在服务器中。可以从浏览器关闭Cookie。

存储在cookie中的数据可以存储几个月或几年,这取决于cookie的寿命。但是,当关闭Web浏览器时,会话中的数据会丢失。


13

会话是服务器上维护的数据块,用于维护HTTP请求之间的状态。HTTP本质上是无状态协议;会话用于赋予状态。

Cookie是发送给客户端和从客户端返回的数据的片段。Cookies通常用于促进会话,因为它告诉服务器哪个客户端处理了哪个会话。还有其他方法可以做到这一点(查询字符串魔术等),但是cookie可能是最常见的。


我在会议上丢失了信息,您可以说为什么解决此问题的最佳方法是什么?阅读我的COMENT上@toomasr解决方案,请
鲁本·鲁伊斯

6

Cookie以文本文件格式存储在浏览器中。它存储的数据量有限,最大4kb [4096bytes]。单个Cookie不能保存多个值,但是可以的,我们可以有多个Cookie。

Cookies易于访问,因此安全较低。setcookie()函数必须出现在tag之前

会话存储在服务器端。会话没有这种存储限制。会话可以包含多个变量。由于它们不容易访问,因此比cookie更安全。


5

曲奇饼

  • 是浏览器(客户端)中保存的少量数据

  • 可以通过PHP进行设置setcookie,然后将其发送到客户端的浏览器(HTTP响应标头Set-cookie

  • 可以在Javascript中直接在客户端设置: document.cookie = 'foo=bar';

  • 如果未设置任何失效日期,则默认情况下,它将在关闭浏览器时失效。
    示例:转到http://example.com,打开控制台,然后执行document.cookie = 'foo=bar';。关闭选项卡,重新打开相同的网站,打开控制台,然后执行以下操作document.cookie:您将看到foo=bar仍然存在。现在关闭浏览器并重新打开,重新访问同一网站,打开控制台;您会看到document.cookie是空的。

  • 您还可以设置准确的到期日期,而不是“关闭浏览器时删除”。

  • 浏览器中存储的cookie会在同一网站的每个请求的标头中发送到服务器(请参阅参考资料Cookie)。您可以通过打开开发人员工具>网络,例如在Chrome上查看此内容,单击请求,请参阅标题

    在此处输入图片说明

  • 可以在客户端读取 document.cookie

  • 可以在服务器端读取 $_COOKIE['foo']

  • 奖励:它也可以用PHP以外的其他语言设置/获取。具有“瓶”微框架的Python示例(另请参见此处):

    from bottle import get, run, request, response
    @get('/')
    def index():
        if request.get_cookie("visited"):
            return "Welcome back! Nice to see you again"
        else:
            response.set_cookie("visited", "yes")
            return "Hello there! Nice to meet you"
    run(host='localhost', port=8080, debug=True, reloader=True)
    

届会

  • 服务器端保存的浏览器会话相关的一些数据

  • 每种服务器端语言可能以不同的方式实现它

  • 在PHP中,何时session_start();调用:

    • 服务器生成一个随机ID,例如 jo96fme9ko0f85cdglb3hl6ah6
    • 文件保存在服务器上,其中包含数据:例如 /var/lib/php5/sess_jo96fme9ko0f85cdglb3hl6ah6
    • 会话ID被发送到客户端的HTTP响应报头,采用传统的cookie机制上面详述Set-Cookie: PHPSESSID=jo96fme9ko0f85cdglb3hl6ah6; path=/

      在此处输入图片说明

      (也可以通过URL而不是Cookie进行发送,但不能通过默认行为发送)

    • 您可以通过看到客户端的会话ID document.cookie

      在此处输入图片说明

  • PHPSESSIDCookie设置没有到期日,因此,当浏览器关闭时它就会过期。因此,当关闭/重新打开浏览器时,“会话”不再有效。

  • 可以在PHP中设置/读取 $_SESSION

  • 客户端看不到会话数据,而只能看到ID:在中执行此操作index.php

    <?php
    session_start();
    $_SESSION["abc"]="def";
    ?>
    

    在客户端上唯一看到的是会话ID(如上所述):

    在此处输入图片说明

  • 因此,会话对于存储客户端不希望看到或修改的数据非常有用

  • 如果您要使用自己的数据库+ ID,并使用传统的Cookie向客户端发送ID /令牌,则可以完全避免使用会话


1
完美的解释
Irshad Khan

2

届会

会话用于维持服务器和用户之间的对话。它更安全,因为它存储在服务器上,我们无法轻松访问它。它在用户计算机上嵌入cookie。它存储无限的数据。

饼干

Cookies存储在本地计算机上。基本上,它会维护用户身份,这意味着它会跟踪访客记录。它没有会话安全。它存储有限数量的数据,并保留有限的时间。


2

所有这些说明中缺少的一部分是Cookie和Session如何通过SessionID cookie链接。Cookie在客户端和服务器之间往返-服务器通过cookie的会话ID部分链接用户(及其会话)。您也可以通过url发送SessionID(不是最佳做法),以防客户端禁用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.