PHP中Sessions和Cookies的区别是什么?

81

PHP中的会话(Sessions)Cookie有何区别?


8
我们是否都同意问题和答案都是与语言无关的,而不特定于PHP?如果是这样,问题不应该被编辑吗? - Augustin Riedinger
8个回答

117

Cookie是存储在浏览器中的一小段数据,并在每个请求中与服务器一起发送。

会话是存储在服务器上并与给定用户关联的数据集(通常通过包含id代码的cookie进行关联)。


3
连接关闭后,会重置会话值。而Cookie值通常会被保存。 - BadSkillz
1
@poter — 如果一条数据被存储在服务器上,那么它并不是由浏览器来存储的(尽管有数据的副本存在),所以不能在会话中存储cookie。 - Quentin
2
@BadSkillz — 不是的。会话值通常在与会话关联的客户端没有连接一段时间后重置。Cookie 值保存到它们的过期时间(如果没有设置,则在关闭浏览器时)。两者都可以使用立即过期覆盖。 - Quentin
@porter — 不会。正如我所说,如果没有为cookie指定过期时间,那么当浏览器关闭时它将被删除。(如果设置了过期时间,在浏览器重新打开之前如果该时间已经过去,则cookie将被删除)。 - Quentin
@poter - 那个问题无法解析。 - Quentin
显示剩余6条评论

56

Cookies用于识别会话。访问任何使用Cookie的站点并打开Chrome检查元素和网络或FireBug(如果使用Firefox),您就可以看到发送到服务器和接收到的标题叫做Cookie。通常它包含一些个人信息(如ID),可以在服务器上用于识别会话。这些Cookies保存在您的计算机上,您的浏览器负责仅将它们发送到标识为与之相关的域。

如果没有Cookie,则每次请求都会通过GET或POST发送唯一的ID。 Cookie类似于静态ID,可以在您的计算机上保留一段时间。

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

Cookie的屏幕截图


额外加分指向Firebug和Chrome开发工具。 - Dhawan Gayash
我在会话中丢失了信息,但Cookie仍然处于活动状态,这导致应用程序出现错误。最好的维护会话的方法是什么?我将数据存储在会话中,但Laravel通过Cookie维护用户登录,会话中的数据已经丢失。我该怎么做或者去哪里阅读相关资料? - Rubén Ruíz
(那是基于Laravel框架的,这就是我的麻烦所在) - Rubén Ruíz
会话和将东西存储在数据库中有什么不同吗? - Suraj Jain
大多数情况下,会话数据默认存储在磁盘的某个位置。因此,在Apache和PHP的情况下,它存储在系统临时文件夹中,或者您可以将其配置为存储在其他位置,甚至是数据库中! - toomasr

21

会话和Cookie的主要区别在于会话数据存储在服务器上,而Cookie在访问者的浏览器中存储数据。

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

存储在Cookie中的数据可以根据Cookie的生命周期存储数月或数年。但是当Web浏览器关闭时,会话中的数据将丢失。


16

Cookie

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

  • 可以使用 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 打开开发人员工具>网络,点击请求,查看标头来查看这一点:

    enter image description here

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

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

  • 额外奖励:还可以使用其他语言而不是 PHP 进行设置/获取。以 Python 中的 "bottle" 微框架为例(也可在此处查看):

    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)
    

会话(Session)

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

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

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

    • 服务器会生成一个随机 ID,例如:jo96fme9ko0f85cdglb3hl6ah6
    • 一个文件被保存在服务器上,包含数据,例如:/var/lib/php5/sess_jo96fme9ko0f85cdglb3hl6ah6
    • 会话 ID 通过 HTTP 响应头传递给客户端,使用上述传统的 cookie 机制Set-Cookie: PHPSESSID=jo96fme9ko0f85cdglb3hl6ah6; path=/

      enter image description here

      (也可以通过 URL 发送会话 ID 而不是 cookie,但这不是默认行为)

    • 你可以使用 document.cookie 在客户端看到会话 ID:

      enter image description here

  • PHPSESSID cookie 没有设置过期时间,因此它会在浏览器关闭时过期。这意味着当浏览器关闭/重新打开时,“会话”不再有效。

  • 可以使用 $_SESSION 在 PHP 中设置/读取会话数据

  • 客户端无法看到会话数据,只能看到会话 ID:在 index.php 中执行以下操作:

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

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

    enter image description here

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

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


3
完美的解释。 - Irshad Khan
4
我看过的关于cookie和session最清晰的解释,特别是关于session在关闭浏览器后如何自动删除。 - Spark.Bao
1
这必须成为被接受的答案。 - Shashikumar Misal

14

会话是在服务器上维护的一块数据,用于在 HTTP 请求之间保持状态。HTTP 基本上是一种无状态协议;会话被用于赋予其状态性。

Cookie 是发送到客户端并返回的一小段数据。Cookie 经常被用来 方便 会话,因为它告诉服务器哪个客户端处理了哪个会话。还有其他方法可以做到这一点(如查询字符串魔法等),但 Cookie 可能是最常见的方法。


我丢失了会话信息,你能告诉我最好的解决方法吗?请阅读我的评论@toomasr的解决方案。 - Rubén Ruíz

5

Cookies以文本文件格式存储在浏览器中。它们只能存储有限数量的数据,最多可达4kb [4096字节]。单个Cookie无法保存多个值,但是我们可以拥有多个Cookie。

由于Cookies易受攻击,因此它们不太安全。setcookie()函数必须出现在标签之前

Sessions存储在服务器端。对于Session没有存储限制。Sessions可以保存多个变量。由于它们不易被攻击,因此比Cookies更加安全。


2

所有这些解释中缺少的一部分是Cookie和Session如何链接-通过SessionID Cookie。Cookie在客户端和服务器之间来回传递,服务器通过Cookie的SessionID部分来连接用户(及其会话)。您也可以通过URL发送SessionID(不是最佳实践)-以防止客户端禁用Cookie。

我理解得对吗?


1

会话

会话用于维护服务器和用户之间的对话。它更加安全,因为它存储在服务器上,我们不能轻易地访问它。它在用户计算机上嵌入了cookie。它可以存储无限量的数据。

Cookie

Cookie 存储在本地计算机上。基本上,它维护用户标识,意味着它跟踪访客记录。相比会话,它不太安全。它只能存储有限量的数据,并且只维护一段时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接