Cookie、Session、Token 与登录验收
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
Cookie 是浏览器存储和传输机制,Session 是会话状态,Token 是凭证。它们不是互斥方案:Cookie 可以保存 Session ID,也可以保存 Token。 HTTP 是 Hypertext Transfer Protocol(超文本传输协议)。
1. 登录链路与选择#
登录/身份回调 → 服务端验证身份 → 创建会话或签发凭证
→ Set-Cookie 或受控返回 Token → 后续请求携带凭证
→ 验证有效性、用户与租户权限 → 返回业务数据
→ 续期/注销/撤销| 方案 | 优点 | 必须解决 |
|---|---|---|
| 不透明 Session ID + 服务端状态 | 易集中撤销、更新权限 | 会话存储可用性、过期与清理、会话固定攻击 |
| 短期访问 Token | 适合 API/服务间调用 | 泄露、过期、作用域、受众、轮换与撤销策略 |
| JWT(JSON Web Token,JSON Web 令牌) | 可在服务端本地验证签名和声明 | 签名不等于加密;须校验允许算法、签发者、受众、有效期,不能只 Base64 解码 |
注销不一定立即作废已签发的无状态访问 Token,要明确短有效期、撤销列表或令牌内省策略。JWT 的格式不保证业务授权正确。JWT 标准。
2. Cookie 配置与边界#
会话 Cookie 常用 Secure; HttpOnly; Path=/; SameSite=Lax;具体 SameSite 取决于登录回调和嵌入流程。__Host- 前缀要求 Secure、Path=/、不设置 Domain,适合限制主机范围。
- HttpOnly 防止脚本直接读取 Cookie,不会阻止恶意脚本借浏览器发已登录请求。
- 跨站 Cookie 通常需 SameSite=None; Secure,仍受第三方 Cookie 策略限制;跨源不一定跨站。
- Cookie 自动附带时,需要 CSRF(Cross-Site Request Forgery,跨站请求伪造)防护;检查 Origin/CSRF token,避免 GET 修改业务。
- localStorage 中的 Token 可被同源脚本读取,要考虑 XSS(Cross-Site Scripting,跨站脚本)风险;不要为“方便”长期保存高权限凭证。
依据:OWASP 会话管理。
3. Hands-on:真实登录流程验收#
准备预发布站点、两个测试账号 A/B(不同租户)、管理员提供的过期/撤销策略,以及无副作用的 /account 类查询路径。已有身份工程可使用 Keycloak 实战。不假设所有系统都有用户名密码 POST 接口。
- 开一个独立浏览器配置文件,打开 Network Preserve log 和 Application/Storage。登录 A,确认凭证不出现在 URL、前端日志、错误追踪中;只记录 Cookie 属性,不复制值到工单。
- 观察登录前后 Session ID 是否更新;检查 Secure、HttpOnly、SameSite、Domain、Path 与过期时间。发生身份提升时也应更新会话。
- 在该站点 Console 执行只读检查,替换路径:
var accountResponse = await fetch('/account', {
credentials: 'include', cache: 'no-store',
signal: AbortSignal.timeout(10000)
});
console.log(accountResponse.status, accountResponse.headers.get('Cache-Control'));应返回当前 A 的信息且不进入共享缓存。API 可能返回 JSON 401,页面可能跳登录;按契约验收,不统一要求所有路径都是 401。
- 另开独立浏览器配置文件登录 B,尝试访问仅用于测试的 A 资源 ID:应 403 或隐藏式 404,不能返回 A 数据。不要靠隐藏按钮实现隔离。
- 正常注销 A,再执行上述查询;应不再访问原会话资源。验证旧凭证撤销需在受控测试工具中重放,凭证只存本地权限 0600 文件,不贴入命令行参数/聊天;无此工具则不把服务端撤销标为已验收。
- 在预发布缩短会话有效期,等待到期后重测查询与刷新;验证并发刷新、刷新令牌轮换、撤销后再次刷新均符合约定。记录实际策略,恢复原过期配置。
- 用应用提供的测试表单/自动化用例发送缺少 CSRF token 的业务修改请求,预期拒绝;有效 token 应成功。身份已过期导致的拒绝不能冒充 CSRF 防护通过。
4. 常见故障与收尾#
| 现象 | 排查 |
|---|---|
| 登录后立刻未登录 | Cookie 域/路径、Secure、SameSite、代理识别协议、跨源 credentials |
| 只在部分实例掉线 | 会话存储共享与可用性、签名密钥轮换、时钟偏差 |
| 注销后仍能调用 | 客户端删除与服务端撤销是否混淆;访问 Token 剩余有效期 |
| B 能读取 A | 服务端租户授权、对象级权限、缓存隔离 |
恢复测试配置,注销测试会话、撤销临时凭证,清除浏览器测试数据。不要保存带 Cookie 的 HAR(HTTP Archive,请求归档)作为公开证据。跨域链路见 浏览器跨域时序。