Cookies与Session

举报
Thunder Wang 发表于 2022/12/22 12:19:08 2022/12/22
【摘要】 因为 HTTP 是无状态的,所以为了将一个请求与其他请求相关联,需要一种在 HTTP 请求之间存储用户数据(保持应用程序状态)的方法。Cookies 和 Sessions 都是在浏览器发出的不同请求之间保持应用程序状态的方法。

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


Cookies

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

name=value; name2=value2
YAML
Copy

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

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

这会让浏览器设置一个名为 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 是在服务端存储的一个数据结构,用来跟踪用户的状态,这个数据可以保存在内存、文件、数据库中【客户明细表】

总结

  1. Cookies 和 Sessions 都是为了在无状态的 HTTP 协议之上维护会话状态,使得服务端可以知道当前是和哪个客户在“打交道”
  2. Sessions ID 是客户端的唯一标识,通常存储在 Cookies 中【浏览器禁用 Cookies 时可以放在 URL 参数中】,它是维持一个会话的核心
  3. 现在大多都是 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;
    }
?>
    
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。