在爬虫、接口自动化、后端接口开发中,登录态保持 是绕不开的核心问题。服务器如何识别 "你还是你"?主流方案分为两大类:Session 机制 与 Token 机制。本文从原理、区别、实战实现三方面,带你彻底掌握登录状态管理。
一、为什么需要登录状态管理?
HTTP 协议本身是无状态的:每一次请求都是独立的,服务器默认不记得上一次请求是谁发的。
如果没有状态保持:
- 每次访问需要权限的接口都要重新输账号密码
- 无法记录用户登录信息、购物车、操作历史
- 爬虫刚登录就失效,根本爬不到需要登录的数据
因此,必须通过Session 或Token,让服务器 "记住" 客户端身份。
二、Session 登录机制(传统服务端状态)
1. Session 工作原理
- 用户第一次登录,提交账号密码。
- 服务器验证通过,在服务端存储一份用户信息(Session),并生成唯一 SessionID。
- 服务器通过 Set-Cookie 把 SessionID 发给浏览器 / 客户端。
- 后续请求,客户端自动在 Cookie 里带上 SessionID。
- 服务器通过 SessionID 找到对应的 Session,识别用户身份。
特点:
- 状态存在服务端,客户端只存 SessionID
- 依赖 Cookie 传递身份标识
- 适合传统网站、单体应用、内网系统
2. 爬虫中保持 Session 实战(以 Python requests 为例)
requests 库自带 Session() 对象,会自动管理 Cookie,完美模拟浏览器登录态。
python
运行
import requests
# 1. 创建会话(自动管理 Cookie)
s = requests.Session()
# 2. 先请求登录接口
login_data = {
"username": "test",
"password": "123456"
}
login_url = "https://xxx.com/login"
s.post(login_url, data=login_data)
# 3. 直接访问需要登录的页面/接口
profile_url = "https://xxx.com/profile"
resp = s.get(profile_url)
print(resp.text) # 已保持登录状态
适用场景:
- 传统表单登录
- 页面依赖 Cookie 验证
- 登录后跳转、多页面爬取
三、Token 登录机制(现代无状态认证)
1. Token 工作原理
Token 是一串加密字符串 ,最常见的是 JWT(JSON Web Token)。
流程:
-
用户登录,账号密码正确。
-
服务器不存状态,直接用密钥生成 Token 返回给前端。
-
客户端把 Token 存在 localStorage、Cookie 或全局变量中。
-
后续请求在 请求头(Header) 里带上:
plaintext
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... -
服务器拿到 Token 后解密验证,不查 Session 存储。
特点:
- 服务端无状态,易分布式部署
- 不强制依赖 Cookie
- 适合前后端分离、APP、小程序、第三方接口
2. 爬虫中 Token 管理实战
python
运行
import requests
# 1. 获取 Token
login_data = {
"username": "test",
"password": "123456"
}
login_url = "https://xxx.com/api/login"
resp = requests.post(login_url, json=login_data)
token = resp.json()["data"]["token"]
# 2. 拼接请求头
headers = {
"Authorization": f"Bearer {token}"
}
# 3. 带 Token 请求需要登录的接口
user_info_url = "https://xxx.com/api/user/info"
resp = requests.get(user_info_url, headers=headers)
print(resp.json())
常见问题:
- Token 过期:需要 ** 刷新 Token(refresh_token)** 机制
- 有的系统把 Token 放在 Cookie,有的放在请求头
- 爬虫要先抓登录包,找到 Token 来源
四、Session 与 Token 核心对比
表格
| 对比项 | Session | Token |
|---|---|---|
| 状态存储位置 | 服务端(内存 / Redis / 数据库) | 客户端(本地存储) |
| 传输方式 | 主要通过 Cookie | Header、Cookie、URL 参数均可 |
| 服务器压力 | 较高,需存储和查询 Session | 低,只需解密校验 |
| 跨域 / 分布式 | 麻烦,需要 Session 共享 | 天然支持,无状态跨域 |
| 安全性 | 依赖 Cookie,易受 CSRF 攻击 | 可防 CSRF,依赖加密签名 |
| 适用场景 | 传统网站、后台管理系统 | 前后端分离、APP、小程序、开放 API |
五、爬虫中如何快速判断用哪种?
- 打开浏览器 F12 → Network → 看登录后的请求:
- 只有 Cookie,没有特殊 Header → Session
- 有
Authorization: Bearer xxx或token: xxx→ Token
- 看接口文档:
- 写 "需要登录态、会话" → Session
- 写 "身份令牌、JWT" → Token
六、登录态保持的通用最佳实践
- ** 优先使用会话(Session 对象)** 统一管理 Cookie 和请求配置。
- 登录前可以先 GET 一下页面,获取隐藏参数、验证码、Cookie。
- 处理好过期机制 :
- Session:过期后重新登录。
- Token:使用 refresh_token 无感刷新。
- 加上请求头伪装(User-Agent、Referer),避免被识别为爬虫。
- 关键请求可加异常捕获,登录失效自动重试登录。
七、总结
- Session :有状态,服务端存储,适合传统网站,爬虫用
requests.Session()轻松搞定。 - Token:无状态,客户端存储,适合前后端分离,爬虫重点处理请求头。
- 本质都是:让服务器在无状态的 HTTP 中识别用户身份。
掌握 Session 与 Token 管理,你就能搞定绝大多数需要登录的网站爬取、接口调用与自动化场景。