Cookies与Session
因为 HTTP 是无状态的,所以为了将一个请求与其他请求相关联,需要一种在 HTTP 请求之间存储用户数据(保持应用程序状态)的方法。Cookies 和 Sessions 都是在浏览器发出的不同请求之间保持应用程序状态的方法。
Cookies
Cookies 是保存在客户端(如浏览器)的一小段数据(最大 4 KB 长),以键值对的形式保存数据:
这些数据可以在客户端进行设置,也可以通过服务器使用 HTTP 头进行设置。例如使用 HTTP 头设置 Cookies 到期时间:
这会让浏览器设置一个名为 name2 的 Cookie,其值为 value2,将在大约 2 年后过期。
下面是 Cookies 的工作流程:
- 客户端→服务器:HTTP 请求
- 服务器→客户端:HTTP 响应 + Set Cookies
- 客户端→服务器:HTTP 请求 + Cookies
- 服务器→客户端:HTTP 响应
Cookies 通常用于保留登录状态,即从浏览器发送用户名和特殊哈希,服务器根据数据库对其进行检查以允许访问。Cookies 也经常用于 Sessions 创建。
然而,存储在 Cookies 中的数据被认为是不安全的,因为它以任何人都能看到的文本格式保存在客户端,用户可以轻易修改其内容。当然,Cookies 中也有一些安全属性:
- HttpOnly:值为 true 或 false,若设置为 true,则不允许通过 JS 脚本 document.cookie 去更改这个值,同样这个值在 document.cookie 中也不可见,这样能有效的防止 XSS 攻击,但在发送请求时依旧会携带此 Cookie
- Secure:默认为空使用 HTTP。若设置为 true,则浏览器只会在 HTTPS 中传输此 Cookie,不会在不安全的 HTTP 协议中传输此 Cookie
Sessions
上述 Cookies 以及 URL 参数(例如http://example.com/mypage?d=lol&boo=no)是在多个请求之间传输数据的合适方法。但是,如果希望数据不被客户端读取 / 编辑【为了安全】,它们就不能满足需求。
解决方案是将该数据存储在服务器端,并给它一个 ID ,只让客户端知道该 ID 并在每次 HTTP 请求时携带该 ID。
于是就有了 Sessions。Sessions 将数据暂时保存在服务器上(无大小限制),每个用户都获得一个 Session ID, 该 ID 通过 Cookies 或 GET 请求发送回服务器进行验证。
下面是 Sessions 的工作流程:
- 客户端→服务器(请求一):登录认证
- 服务器→客户端:鉴权成功后返回 HTTP 响应 + Set Cookies【包含 Session ID】
- 客户端→服务器(请求二):查看个人信息 + Cookies【包含 Session ID】
- 服务器→客户端:取出 Session ID 判断具体用户
Sessions 通常是短暂的,这使得它们非常适合在应用程序之间保存临时状态。用户关闭浏览器或注销时,Sessions 也会过期。
Sessions 被认为比 Cookies 更安全,因为数据本身保存在服务器上。
Cookies 和 Sessions 的区别
Cookie | Session | |
---|---|---|
存储方式 | Cookie 存储在客户端,方便与 JS 交互,方便获取用户信息 | Session 存储在服务端,高效、安全,不依赖浏览器环境 |
存储类型 | Cookie 只能存储 ASCII 码 字符串 | Session 可以存储任意数据类型 |
存储大小 | Cookie 大小有限制(4KB),同一域名下的数量也有限制(20 个) | Session 没有类似的限制(128MB)【可能脚本内存限制 128 MB】 |
生命周期 | Cookie 可设置为长时间保持,比如经常使用的默认登录功能 | Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效 |
安全性 | Cookie 是本地存储,不够安全,别人可以分析存放在本地的 Cookie 并进行欺骗,存在 CSRF 风险 | |
特点 | Cookie 是客户端存储用户信息的一种机制,用来记录用户的一些信息,也是实现 Session 的一种方式【通行证】 | Session 是在服务端存储的一个数据结构,用来跟踪用户的状态,这个数据可以保存在内存、文件、数据库中【客户明细表】 |
总结
- Cookies 和 Sessions 都是为了在无状态的 HTTP 协议之上维护会话状态,使得服务端可以知道当前是和哪个客户在“打交道”
- Sessions ID 是客户端的唯一标识,通常存储在 Cookies 中【浏览器禁用 Cookies 时可以放在 URL 参数中】,它是维持一个会话的核心
- 现在大多都是 Sessions + Cookies同时使用,虽然只用 Sessions 不用 Cookies,或是只用 Cookies 不用Sessions 在理论上都可以保持会话状态,但通常不会单独使用
Cookie使用实例
以下是一段Cookie加密的代码逻辑原理,详细教程可转到本站该篇文章
如何在php中实现网站页面加密 - 芒果个人日志 (wyz-math.cn)
function MkEncrypt($password, $pageid = 'default') {
$pageid = md5($pageid);
$md5pw = md5(md5($password).MK_ENCRYPT_SALT);
$postpwd = isset($_POST['pagepwd']) ? addslashes(trim($_POST['pagepwd'])) : '';
$cookiepwd = isset($_COOKIE['mk_encrypt_'.$pageid]) ? addslashes(trim($_COOKIE['mk_encrypt_'.$pageid])) : '';
if($cookiepwd == $md5pw) return; // Cookie密码验证正确
if($postpwd == $password) { // 提交的密码正确
setcookie('mk_encrypt_' . $pageid, $md5pw, time() + 3600000, '/');
return;
}
?>
- 点赞
- 收藏
- 关注作者
评论(0)