Cookies 与 Sessions 学习笔记

/ 0评 / 1

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

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

总结

  1. Cookies 和 Sessions 都是为了在无状态的 HTTP 协议之上维护会话状态,使得服务端可以知道当前是和哪个客户在“打交道”
  2. Sessions ID 是客户端的唯一标识,通常存储在 Cookies 中【浏览器禁用 Cookies 时可以放在 URL 参数中】,它是维持一个会话的核心
  3. 现在大多都是 Sessions + Cookies同时使用,虽然只用 Sessions 不用 Cookies,或是只用 Cookies 不用Sessions 在理论上都可以保持会话状态,但通常不会单独使用

参考

  1. What are sessions? How do they work? - Stack Overflow
  2. What are cookies and sessions, and how do they relate to each other? - Stack Overflow
  3. Difference between Session and Cookies - GeeksforGeeks
  4. 彻底弄懂session,cookie,token - SegmentFault 思否
  5. Cookie 和 Session 的详解与区别 - 织梦笔记

发表回复

您的电子邮箱地址不会被公开。