做Web测试,尤其是接口测试,经常会遇到鉴权相关的问题:
-
“为什么我登录了,接口还是返回401?” -
“Token过期了怎么办?” -
“Cookie和Token有什么区别?”
这些问题,都绕不开三个核心概念:Cookie、Session、Token。这篇文章,我来用最通俗的方式讲清楚它们。
一、先理解问题:Web应用如何”记住”用户?
HTTP协议有一个特点:无状态。服务器收到请求,处理完就忘了,不会记住”刚才谁来过”。
但Web应用需要”记住”用户,比如:
-
用户登录后,刷新页面还是登录状态 -
购物车的商品,刷新后还在 -
用户的个性化设置,下次访问还生效
这就需要一个机制,让服务器能”认出”用户。Cookie、Session、Token,就是三种不同的”认人”方式。
二、Cookie:服务器给客户端发的”身份证”
什么是Cookie?Cookie是服务器发送给浏览器的一小段数据,浏览器会保存起来,下次请求时自动带上。 |
工作流程:
|
Cookie的特点:
-
存储在浏览器端(客户端) -
每次请求自动带上,无需手动处理 -
有大小限制(约4KB) -
可以设置过期时间、作用域、安全属性
三、Session:服务器端的”档案柜”
什么是Session?Session是服务器端存储的用户会话数据。服务器给每个会话分配一个ID(Session ID),通过Cookie传给客户端。 |
工作流程:
|
Session的特点:
-
数据存储在服务器端,相对安全 -
依赖Cookie传递Session ID -
服务器需要存储所有Session,有内存压力 -
多服务器集群时,需要Session共享机制
四、Token:自包含的”通行证”
什么是Token?Token是一个自包含的凭证,本身携带了用户信息,不需要服务器端存储。最常用的是JWT(JSON Web Token)。 |
|
工作流程: |
Token的特点:
-
自包含:Token本身携带用户信息,服务器无需存储 -
跨域友好:不依赖Cookie,适合前后端分离、移动端 -
无状态:服务器不需要维护Session,易于扩展 -
有过期时间,需要刷新机制
五、三者对比:一张表看明白
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
六、测试中如何应用
基于Cookie/Session的测试要点
-
✓ 登录后检查Cookie是否正确设置(名称、值、过期时间、HttpOnly属性) -
✓ 清除Cookie后,访问需要登录的页面,应跳转到登录页 -
✓ Session过期后,操作应提示重新登录 -
✓ 同一账号多设备登录,Session处理是否正确 -
✓ 退出登录,检查Cookie是否清除、Session是否失效
基于Token的测试要点
-
✓ 登录接口返回Token,检查Token格式和内容 -
✓ 后续请求在Header中带上Token: Authorization: Bearer {token} -
✓ Token过期后,接口返回401,提示重新登录 -
✓ Token错误或被篡改,接口返回401 -
✓ 刷新Token机制是否正常 -
✓ 退出登录,Token是否失效
七、常见问题与排查
问题1:接口返回401,但我已经登录了
排查:
-
检查请求是否带了Token/Cookie -
检查Token是否过期 -
检查Token格式是否正确(Bearer前缀、编码问题)
问题2:登录后刷新页面变成未登录
排查:
-
检查Token是否正确保存(localStorage vs sessionStorage) -
检查页面加载时是否正确读取Token -
检查Cookie是否设置了正确的过期时间
问题3:跨域请求带上Cookie失败
排查:
-
检查是否设置了 withCredentials: true -
检查服务器是否返回了正确的CORS头 -
考虑改用Token方式,避免跨域Cookie问题
八、写在最后
Cookie、Session、Token,本质都是解决同一个问题:让服务器能识别用户。只是实现方式不同:
-
Cookie是”身份证”,每次都出示 -
Session是”档案号”,服务器根据号码查档案 -
Token是”通行证”,本身就有权限信息
作为测试工程师,不需要深入理解它们的技术实现,但需要知道:
-
系统用的是哪种方式 -
测试时如何模拟登录状态 -
鉴权失败时如何排查
总结:搞懂Cookie、Session、Token,Web测试中的鉴权问题就解决了一大半。下次遇到401,别慌,按这篇文章的思路排查。
