Session 是什么?
在学习 Web 渗透的时候,Cookie 基本是绕不开的知识点。
但学完 Cookie 后,我又出现了一个新的问题:
网站到底是怎么一直记住“我是谁”的?
比如:
- 登录淘宝后刷新页面不会掉登录
- QQ 邮箱不用每次重新输入密码
- 很多网站甚至几天后还认识你
后来才知道,这背后其实就是Session 会话机制。
一、什么是 Session?
简单来说:
Session 是服务器用来记录用户状态的一种机制。
比如:
我登录了一个网站。
服务器会创建一份属于我的“登录记录”:
用户ID:10001 用户名:admin 登录状态:true 权限:admin
这份数据一般保存在:
- 服务器内存
- Redis
- 数据库
- Session 文件
而不是直接存在浏览器里。
这也是 Session 比 Cookie 更安全的原因之一。
二、Session 和 Cookie 的关系
很多新人容易把这两个搞混。
其实:
Cookie:保存在浏览器
Session:保存在服务器
但是:
它们两个通常是配合使用的。
流程大概是这样:
1. 用户登录网站
2. 服务器创建 Session
3. 服务器生成 SessionID
4. SessionID 返回给浏览器
5. 浏览器把 SessionID 存进 Cookie
6. 后续请求自动携带 SessionID
7. 服务器根据 SessionID 找到对应 Session
所以很多网站抓包时会看到:
PHPSESSID=xxxxx JSESSIONID=xxxxx ASP.NET_SessionId=xxxxx
这些本质上都是 SessionID。
三、为什么 Session 比 Cookie 更安全?
因为:
Cookie 可以直接保存数据。
比如:
username=admin role=administrator
如果网站设计不当,攻击者可能会篡改。
而 Session 不一样:
浏览器只保存:SessionID
真正的数据在服务器。
即使用户看到了 SessionID,也看不到真正的登录信息。
四、Session 的工作流程
在我看来他的流程其实很像“会员卡”。
所以:
服务器真正认的是:
SessionID
而不是浏览器本身。
五、什么是 Session 劫持?
这个在 Web 渗透里非常经典。
攻击者如果获取到了别人的 SessionID:
PHPSESSID=xxxxxx
就可能直接冒充对方登录。
这就叫:
Session Hijacking(Session 劫持)
比如:
- XSS 窃取 Cookie
- 抓包获取 SessionID
- HTTP 明文传输泄露
都有可能导致 Session 被盗。
所以很多网站现在都会:
- 强制 HTTPS
- 设置 HttpOnly
- 设置 Secure
- 设置 SameSite
来保护 Session。
六、学习后的理解
之前我一直以为:
网站记住登录状态,是浏览器保存了账号密码。
现在才发现:
其实大部分网站保存的是:
SessionID
服务器才是真正保存用户数据的地方。
Cookie 更像:
“门票”
Session 更像:
“后台档案”
七、总结
一句话理解:
Cookie 负责携带身份凭证
Session 负责保存用户状态
Session 是 Web 安全里非常重要的基础知识。
后面学习:
- JWT
- Token
- 身份认证
- 越权漏洞
- Session 劫持
- XSS
都会和它有关。