如果会话存储在文件中,为啥仍然使用 cookie 来存储它们?

Posted

技术标签:

【中文标题】如果会话存储在文件中,为啥仍然使用 cookie 来存储它们?【英文标题】:if sessions are stored in files why are cookies still used to store them?如果会话存储在文件中,为什么仍然使用 cookie 来存储它们? 【发布时间】:2017-06-25 13:40:57 【问题描述】:

客户: start_session() 创建一个 cookie(默认):Name: phpSESSID; Content: 1q2w3e4r5t; Domain: '/'; Expires:...

服务器: 它还创建了一个存储在(我的案例)中的文件:/var/lib/php/sessions。在那里打电话:sess_1q2w3e4r5t。 (绝对路径:/var/lib/php/sessions/sess_1q2w3e4r5t

所以我们有两个物理的东西绑定到我刚刚创建的会话。

两者兼有有何意义?

无论use_only_cookies 选项如何,我都可以将我的会话存储在/var/lib/php/sessions 中吗?

我有一个带有$_SESSION['counter'] 变量的经典示例。这意味着,每次我重新加载 example.php 页面时,$_SESSION['counter'] 都会增加(++)1。因此,在按下F5 按钮的循环中,假设我得到55 作为$_SESSION['counter'] 的值。最后我是那个 cookie,但 不是 /var/lib... 文件。删除之后我得到一个 56 并且循环正常继续。这只是引起了我的兴趣并让我想到了这个问题。是否需要会话 cookie?

我的网站是否仍然可以只在服务器中存储会话而不使用 cookie?

这就是我删除 cookie 的方式。注意counter 的值为 69。

然后F5:

【问题讨论】:

嗯?没有 cookie,您的所有请求都将是无状态的。 但是.. 就像我说的,在删除 cookie 之后,$_SESSION['counter'] 仍然保持相同的值...如果我将其称为一种请求时,请纠正我 您是否混淆了删除 cookie 与删除会话或会话变量不同的事实?你必须在 PHP 中使用unset($_SESSION['counter'])失去它的价值。 好吧,最近我读到了cookies vs sessions 和this question。我意识到一个存储在服务器中,另一个存储在客户端。但是,仍然可能是我的网站仅在服务器中存储会话而不使用 cookie 的一种方式? PHP 用于会话的 cookie 是 PHPSESSIDGLOBAL_SESS 一定是你在某处设置的。 【参考方案1】:

cookie 在那里,以便客户端可以告诉服务器哪个会话文件是他们的。 cookie 值对应于在服务器上创建的文件。

没有它,服务器只会为客户端创建一个新的会话文件,显然之前的请求中的任何数据都不会存在。

我只能想象你没有正确删除 cookie。

【讨论】:

我会标记会话文件以获取会话 ID:sess_ + 1q2w3e4r5t。因此,不需要 cookie。 那么你怎么知道在两个后续请求中客户是否是同一个人呢?您只是在谈论服务器端的事情。客户端需要告诉服务器哪个会话是他们的。【参考方案2】:

访问您网站的访问者被分配了一个唯一的 ID,即 所谓的会话ID。这要么存储在用户的 cookie 中 侧或在 URL 中传播。

同时拥有 session 和 cookie 的重点是上面的引用

简而言之:没有 cookie,客户端会变成陌生访客

【讨论】:

以上是关于如果会话存储在文件中,为啥仍然使用 cookie 来存储它们?的主要内容,如果未能解决你的问题,请参考以下文章

为啥大型网站不喜欢本地存储而不是 cookie? [复制]

为啥 Django 不在 Varnish 代理后面生成 CSRF 或会话 Cookie?

Compojure/Ring:为啥与 cookie-store 的会话在服务器重新启动后无法幸存?

MVC 4:如何在 IIS 重启后保持会话和 cookie 仍然有效?

如何在 Postman 中删除会话 cookie?

关于Cookie的知识的总结