0.37 Cookie 与 Session:网站怎么记住你是谁
第〇篇【零基础预科】免费。上一篇讲了 HTTP 报文,这一篇解决一个关键问题:HTTP 每次请求都是独立的,那为什么登录一次后,连续点几个页面网站都还认得你?
一、HTTP 是无状态的
HTTP 有个重要特性叫【无状态】(stateless):服务器处理完一个请求就把它忘了,下一个请求到来时,并不知道它和上一个请求是不是同一个人发的。
这在单纯浏览公开页面时没问题,但登录、购物车这类场景必须【记住状态】。Cookie 和 Session 就是为了解决这个问题。
二、Cookie 是什么
Cookie 是服务器通过响应下发、由浏览器保存的一小段数据,浏览器在之后访问同一网站时会自动把它放进请求头带回去。
第一次访问和后续访问的区别:
第1次请求:浏览器 → 服务器(没有 Cookie)
第1次响应:服务器 → 浏览器,Set-Cookie: id=abc123
第2次请求:浏览器 → 服务器,自动带上 Cookie: id=abc123这样服务器就有了一个识别依据。Cookie 有几个常见属性:
| 属性 | 作用 |
|---|---|
| Expires / Max-Age | 过期时间;不设则关闭浏览器即失效(会话 Cookie) |
| HttpOnly | 禁止 JavaScript 读取,降低被脚本窃取的风险 |
| Secure | 只通过 HTTPS 传输 |
| SameSite | 限制跨站携带,缓解跨站请求伪造 |
三、Session 是什么
直接把用户信息都放在 Cookie 里不安全(浏览器端可被查看、篡改),所以更常见的做法是:
- Session:真正的会话信息保存在服务器端(内存、文件或缓存中)
- 服务器给每个会话分配一个唯一的 Session ID
- 浏览器的 Cookie 里只存这个 Session ID,不存具体信息
可以类比去游泳馆:你把个人信息登记在前台(服务器端 Session),拿到一个手牌号码(Session ID)。之后每次凭手牌号码,前台就能查到你的资料。手牌本身不含敏感信息,丢了别人也未必能立刻冒充,但号码仍需保护。
四、登录到底发生了什么
把前面的知识串起来,一次登录的完整过程:
这就是为什么登录一次后,连续访问多个页面都保持登录态——浏览器一直在用 Cookie 里的那个标识证明身份,直到 Cookie 过期或你主动退出。
五、安全视角
会话标识一旦被盗,攻击者就可能冒充你的身份,这是很多攻击的核心目标:
- XSS 窃取 Cookie:如果页面存在跨站脚本漏洞,恶意脚本能读取未加 HttpOnly 保护的 Cookie。给 Cookie 加 HttpOnly 是基础防护。
- 会话固定:攻击者诱导你使用他指定的 Session ID,等你登录后他凭此 ID 冒充。安全的做法是登录后重新生成 Session ID。
- 明文传输:在 HTTP 下 Cookie 可能被中途截获,应使用 HTTPS。
- 公用电脑:用完要主动退出,清除会话,避免下一个人直接进入你的账号。
测试中经常需要观察:登录后 Cookie 里多了哪个字段、它有什么属性、退出后是否失效。这些细节直接关系到认证机制是否安全。
六、Cookie 与 Session 对比
| 对比项 | Cookie | Session |
|---|---|---|
| 存储位置 | 浏览器端 | 服务器端 |
| 内容 | 小量数据,可以是 Session ID | 完整会话信息 |
| 安全性 | 可被查看,敏感内容不宜直接放 | 在服务端,相对安全 |
| 典型用途 | 携带标识、记住偏好 | 保存登录态、业务状态 |
| 生命周期 | 可设过期时间,也可随浏览器关闭 | 通常随超时或退出而销毁 |
七、本篇小结
- HTTP 无状态,Cookie 和 Session 用来在多次请求间维持身份。
- Cookie 在浏览器端、会自动携带;Session 在服务器端,靠 Session ID 对应。
- 登录 = 服务器创建会话并下发标识,之后凭标识认出用户。
- 保护会话标识(HttpOnly、HTTPS、登录后重生成、可退出)是认证安全的关键。
© 2026 光跃Eason·安研社
仅限授权安全测试与学习研究使用,禁止用于任何非法攻击场景。
微信:lightleap612
仅限授权安全测试与学习研究使用,禁止用于任何非法攻击场景。
微信:lightleap612