【发布时间】:2011-09-14 10:48:21
【问题描述】:
PHP中的Sessions和Cookies有什么区别?
【问题讨论】:
-
我们是否同意问题和答案都与语言无关且不特定于 PHP?如果是这样,不应该编辑问题吗?
标签: php session cookies session-state session-cookies
PHP中的Sessions和Cookies有什么区别?
【问题讨论】:
标签: php session cookies session-state session-cookies
cookie 是浏览器存储的一些数据,并随每个请求发送到服务器。
会话是存储在服务器上并与给定用户关联的数据集合(通常通过包含 id 代码的 cookie)
【讨论】:
会话是在服务器上维护的一块数据,用于维护 HTTP 请求之间的状态。 HTTP 本质上是一个无状态协议;会话用于赋予它有状态。
cookie 是发送到客户端和从客户端返回的数据的 sn-p。 Cookie 通常用于促进会话,因为它告诉服务器哪个客户端处理了哪个会话。还有其他方法可以做到这一点(查询字符串魔术等),但 cookie 可能是最常见的。
【讨论】:
Cookies 用于识别会话。访问任何使用 cookie 的网站,然后调出 Chrome 检查元素,然后调出网络或 FireBug(如果使用 Firefox)。
您可以看到有一个标头发送到服务器并接收到称为Cookie。通常它包含一些可以在服务器上用于识别会话的个人信息(如 ID)。这些 cookie 保留在您的计算机上,您的浏览器负责将它们仅发送到使用它识别的域。
如果没有 cookie,那么您将通过 GET 或 POST 在每个请求上发送一个唯一 ID。 Cookie 就像在您的计算机上保留一段时间的静态 ID。
会话是服务器上与 cookie 信息相关联的一组信息。如果您使用的是 PHP,您可以检查 session.save_path 位置并实际“查看会话”。它们要么是服务器文件系统上的文件,要么是数据库中的文件。
【讨论】:
会话和 cookie 的主要区别在于会话数据存储在服务器上,而 cookie 将数据存储在访问者的浏览器中。
会话比 cookie 更安全,因为它存储在服务器中。可以从浏览器关闭 Cookie。
存储在 cookie 中的数据可以存储数月或数年,具体取决于 cookie 的寿命。但是当浏览器关闭时会话中的数据会丢失。
【讨论】:
Cookies以文本文件格式存储在浏览器中。它存储的数据量有限,最多4kb[4096bytes]。单个Cookie不能保存多个值但是是的,我们可以拥有多个 cookie。
Cookie 易于访问,因此它们安全性较低。 setcookie() 函数必须出现在标签之前。
会话存储在服务器端。会话没有这样的存储限制。会话可以保存多个变量。由于它们不易访问,因此比 cookie 更安全。
【讨论】:
会话用于维护服务器和用户之间的对话。 它更安全,因为它存储在服务器上,我们不能轻易访问它。 它在用户计算机上嵌入 cookie。它存储无限数据。
Cookie 存储在本地计算机上。基本上,它维护用户标识,这意味着它跟踪访问者记录。它不如会话安全。 它存储有限数量的数据,并在有限的时间内维护。
【讨论】:
所有这些解释中缺少的一个部分是 Cookie 和会话如何链接 - 通过 SessionID cookie。 Cookie 在客户端和服务器之间来回传输 - 服务器通过 cookie 的会话 ID 部分链接用户(及其会话)。 您也可以通过 url 发送 SessionID(不是最佳实践) - 以防客户端禁用 cookie。
我做对了吗?
【讨论】:
是保存在浏览器(客户端)中的少量数据
可以用setcookie从PHP中设置,然后发送到客户端的浏览器(HTTP响应头Set-cookie)
可以直接在Javascript客户端设置:document.cookie = 'foo=bar';
如果没有设置过期时间,默认在关闭浏览器时过期。
示例:继续http://example.com,打开控制台,执行document.cookie = 'foo=bar';。关闭选项卡,重新打开同一个网站,打开控制台,执行document.cookie:你会看到foo=bar 仍然存在。现在关闭浏览器并重新打开它,重新访问同一个网站,打开控制台;你会看到document.cookie 是空的。
您还可以设置一个精确的过期日期,而不是“关闭浏览器时删除”。
存储在浏览器中的 cookie 在同一网站的每个请求的标头中发送到服务器(请参阅Cookie)。例如,您可以通过打开 开发者工具 > 网络,在 Chrome 中看到这一点,点击请求,查看 Headers:
可以用document.cookie在客户端读取
可以用$_COOKIE['foo']在服务器端读取
奖励:它也可以使用 PHP 以外的其他语言设置/获取。带有“瓶子”微框架 (see also here) 的 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(); 被调用时:
PHPSESSID cookie 设置为没有过期日期,因此它会在浏览器关闭时过期。因此,当浏览器关闭/重新打开时,“会话”不再有效。
可以用$_SESSION在PHP中设置/读取
客户端看不到会话数据,只看到 ID:在index.php 中执行此操作:
<?php
session_start();
$_SESSION["abc"]="def";
?>
在客户端看到的唯一内容是(如上所述)会话 ID:
因此,会话对于存储您不希望客户端看到或修改的数据很有用
如果您想使用自己的数据库 + ID 并使用传统 Cookie 向客户端发送 ID/令牌,则可以完全避免使用会话
【讨论】: