Cookies与Session

简介: 因为 HTTP 是无状态的,所以为了将一个请求与其他请求相关联,需要一种在 HTTP 请求之间存储用户数据(保持应用程序状态)的方法。Cookies 和 Sessions 都是在浏览器发出的不同请求之间保持应用程序状态的方法。

Cookies

Cookies 是保存在客户端(如浏览器)的一小段数据(最大 4 KB 长),以键值对的形式保存数据:

name=value; name2=value2

这些数据可以在客户端进行设置,也可以通过服务器使用 HTTP 头进行设置。例如使用 HTTP 头设置 Cookies 到期时间:

Set-Cookie: name2=value2; Expires=Wed, 19 May 2023 10:18:14 GMT

这会让浏览器设置一个名为 name2 的 Cookie,其值为 value2,将在大约 2 年后过期。


下面是 Cookies 的工作流程:

1.客户端→服务器:HTTP 请求

2.服务器→客户端:HTTP 响应 + Set Cookies

3.客户端→服务器:HTTP 请求 + Cookies

4.服务器→客户端:HTTP 响应


Cookies 通常用于保留登录状态,即从浏览器发送用户名和特殊哈希,服务器根据数据库对其进行检查以允许访问。Cookies 也经常用于 Sessions 创建。

然而,存储在 Cookies 中的数据被认为是不安全的,因为它以任何人都能看到的文本格式保存在客户端,用户可以轻易修改其内容。当然,Cookies 中也有一些安全属性:

1.HttpOnly:值为 true 或 false,若设置为 true,则不允许通过 JS 脚本 document.cookie 去更改这个值,同样这个值在 document.cookie 中也不可见,这样能有效的防止 XSS 攻击,但在发送请求时依旧会携带此 Cookie

2.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 的工作流程:

1.客户端→服务器(请求一):登录认证

2.服务器→客户端:鉴权成功后返回 HTTP 响应 + Set Cookies【包含 Session ID】

3.客户端→服务器(请求二):查看个人信息 + Cookies【包含 Session ID】

4.服务器→客户端:取出 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中如何给页面进行加密

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;
    }
?>

目录
相关文章
|
3月前
|
存储 缓存 安全
Cookie和Session
【8月更文挑战第20天】
24 1
|
6月前
|
Java
Cookie和Session
Cookie和Session
37 0
|
应用服务中间件 API
01-Cookie&Session2
01-Cookie&Session2
48 0
|
12月前
|
安全 数据库
session 和 cookie 的理解
session 和 cookie 的理解
27 0
|
API
01-Cookie&Session3
01-Cookie&Session3
75 0
|
应用服务中间件
01-Cookie&Session1
01-Cookie&Session1
59 0
|
数据安全/隐私保护
cookie和session
在生活中,虽然周围的事情很多,但是有很多神奇的东西在帮助我们记录我们的生活轨迹,让我们的生活变得更加简单和快捷。比如,我们在使用网易博客登录时,发现可以通过设置"7天内免登录"来使网页记录自己的用户名和密码,使用浏览器时也可以打开自己刚关闭的网页,逛淘宝时,页面会推荐这几天自己正在注意的一些商品。。。这是为什么呢?
|
存储 缓存 Java
|
存储 数据安全/隐私保护
session 和 Cookie 详解
session 和 Cookie 详解
121 0
|
存储 编解码 应用服务中间件
Cookie和Session详解
Cookie和Session详解
131 1