一、基于 Cookie-Session 的登录鉴权
1. 实现原理
- 用户登录成功后,服务端生成唯一的 Session ID,并将其存储在服务器内存或数据库中。
- 通过
Set-Cookie
响应头将 Session ID 返回给浏览器,浏览器后续请求自动携带该 Cookie。 - 服务端通过 Session ID 验证用户身份。
2. 优缺点
优点:
- 实现简单:易于理解和实现,兼容性强。
- 兼容性好:适用于传统 Web 应用。
缺点:
- 服务器内存压力:Session 数据存储在服务器内存中,用户量较大时对内存有较高要求。
- 分布式问题:在集群或分布式架构中,需要同步 Session 数据,影响性能。
- 单点故障:如果服务器宕机,Session 数据可能丢失。
3. 补充
- IP Hash 映射:通过请求的 IP 进行 Hash 映射,确保同一用户始终访问同一台服务器。但如果服务器宕机,会导致部分用户 Session 数据丢失。
二、基于 Token(如 JWT)的无状态认证
1. 实现原理
- 用户登录成功后,服务端生成一个签名后的 Token(如 JWT),返回给客户端。
- 客户端将 Token 存储在 LocalStorage 或 Cookie 中,并在请求头中携带(如
Authorization: Bearer <token>
)。 - 服务端通过验证 Token 的签名和有效期来确认用户身份。
2. JWT 结构
JWT 由三部分组成:
- Header:描述 Token 类型和加密算法。
{
"alg": "HS256", // 加密算法
"typ": "JWT" // Token 类型
}
- Payload:存放用户信息和声明。
{
"sub": "1234567890", // 用户ID
"name": "John Doe", // 用户名
"iat": 1516239022, // 签发时间
"exp": 1516242622 // 过期时间
}
- Signature:对 Header 和 Payload 的签名,确保 Token 的完整性。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret
3. 优缺点
优点:
- 无状态:服务端无需存储 Token,天然支持分布式系统。
- 自包含:Token 中包含用户信息,减少数据库查询。
- 安全性:通过签名防止篡改,支持加密算法(如 HMAC、RSA)。
缺点:
- 无法主动失效:Token 一旦签发,服务端无法主动使其失效(除非过期)。
- 续期问题:Token 过期后,用户必须重新登录,难以实现无感刷新。
三、Redis 存储 Token 的增强方案
1. 实现原理
- 用户登录成功后,服务端生成一个随机 Token(如 UUID),并将其作为 Key,用户信息作为 Value 存储在 Redis 中,设置过期时间。
- 客户端存储 Token,并在请求时携带。
- 服务端通过 Redis 验证 Token 的有效性。
2. 优缺点
优点:
- 主动失效:通过删除 Redis 中的 Token,可以主动使其失效。
- 会话控制:可以限制用户的并发会话数。
缺点:
- 依赖 Redis:增加了系统架构的复杂度。
- 登录时间控制问题:固定过期时间可能导致用户体验不佳,滑动过期可能增加安全风险。
3. 适用场景
- 需要高安全性和会话控制的中大型应用。
四、OAuth 2.0 / 第三方登录
1. 实现原理
- 允许用户通过第三方平台(如微信、GitHub)登录。
- 服务端通过 OAuth 协议获取用户授权信息,完成本地登录或注册。
2. 授权码模式流程
- 用户点击“第三方登录”,跳转到第三方授权页面。
- 用户授权后,第三方回调应用并返回授权码(Authorization Code)。
- 服务端用授权码向第三方换取 Access Token。
- 服务端通过 Access Token 获取用户信息(如 OpenID),完成本地登录或注册。
3. 适用场景
- 需要第三方账号快速登录的应用。
五、双 Token 机制
1. 实现原理
- Access Token
-
- 作用:用于访问受保护的资源,携带用户信息和权限。
- 特点:
-
-
- 有效期较短(如 5 分钟)。
- 每次请求都需要携带。
- 过期后需要重新获取。
-
- Refresh Token
-
- 作用:用于获取新的 Access Token。
- 特点:
-
-
- 有效期较长(如 24 小时)。
- 不携带用户信息,仅用于刷新 Access Token。
-
-
- 存储在安全的地方(如 HttpOnly Cookie)。
2. 工作流程
- 用户登录
-
- 用户提交账号密码,服务端验证成功后生成 Access Token 和 Refresh Token,并返回给客户端。
- 请求受保护资源
-
- 客户端在请求头中携带 Access Token(如 Authorization: Bearer <accessToken>)。
- 服务端验证 Access Token:
- 如果有效,处理请求并返回数据。
- 如果过期,返回错误码(如 401 Unauthorized),提示客户端刷新 Token。
- 刷新 Access Token
-
- 客户端检测到 Access Token 过期后,使用 Refresh Token 请求新的 Token。
- 服务端验证 Refresh Token:
- 如果有效,生成新的 Access Token 和 Refresh Token,并返回给客户端。
- 如果过期,返回错误码(如 401 Unauthorized),提示用户重新登录。
- 用户重新登录
-
- 如果 Refresh Token 也过期,客户端提示用户重新输入账号密码登录。
3. 优缺点
优点
○ Access Token 有效期短,减少泄露风险。即使 Access Token 被截取,攻击者也仅能在短时间内利用。
○ Refresh Token 存储在安全的地方(如 HttpOnly Cookie),避免被恶意脚本窃取。
○ 用户无需频繁登录,通过 Refresh Token 自动刷新 Access Token,提升了用户的使用便利性。
○ 可以根据业务需求调整 Access Token 和 Refresh Token 的过期时间,支持滑动过期和会话控制。
缺点
○ 相比单 Token 机制,双 Token 机制的实现更为复杂,需要额外处理 Refresh Token 的存储、验证和失效逻辑。
○ 无法主动失效:Token 一旦签发,服务端无法主动使其失效。
六、双 Token 三验证机制
1. 背景
- 单 Token ,双 Token,Redis 存储 Token 都没有真正完全解决这两个问题
-
- 有效期设置矛盾:短有效期影响用户体验,长有效期增加安全风险。
- 无法主动失效:Token 一旦签发,服务端无法主动使其失效。
2. 实现原理
- 双 Token:
-
- Access Token:有效期短(如 5 分钟),用于日常请求。
- Refresh Token:有效期长(如 24 小时),用于刷新 Access Token。
- 三验证:
-
- Access Token 验证:每次请求验证 Access Token 是否有效。
- Refresh Token 验证:Access Token 过期后,使用 Refresh Token 刷新。
- Redis 验证:Refresh Token 存储于 Redis,确保只能使用一次。
3. 流程
- 用户登录:
-
- 生成 Access Token 和 Refresh Token。
- 将 Refresh Token 存储到 Redis,设置过期时间。
- 返回双 Token 给客户端。
- 请求验证:
-
- 客户端携带 Access Token 请求资源。
- 服务端验证 Access Token:
-
-
- 有效:处理请求。
- 过期:返回 401,提示客户端刷新 Token。
-
- 刷新 Token:
-
- 客户端使用 Refresh Token 请求新的 Token。
- 服务端验证 Refresh Token:
-
-
- 有效:生成新的双 Token,更新 Redis。
- 无效:返回 401,提示用户重新登录。
-
- 主动失效:
-
- 服务端检测到异常(如异地登录),删除 Redis 中的 Refresh Token,使其失效。
4. 优点
- 安全性:
-
- Access Token 有效期短,减少泄露风险。
- Refresh Token 存储于 Redis,可主动失效。
- 用户体验:
-
- 用户无需频繁登录,通过 Refresh Token 自动刷新 Access Token。
- 灵活性:
-
- 支持滑动过期和会话控制。
5. 适用场景
- 对安全性和用户体验要求较高的系统(如金融、电商)。
- 需要支持多设备登录和会话管理的场景。
七、总结
方案 | 状态管理 | 扩展性 | 安全性 | 适用场景 |
Cookie-Session | 有状态 | 低 | 中 | 传统 Web 应用 |
JWT | 无状态 | 高 | 中高 | 分布式系统、移动端 |
Redis + Token | 有状态 | 高 | 高 | 需会话控制的企业应用 |
OAuth 2.0 | 依赖第三方 | 高 | 高 | 第三方登录集成 |
双 Token 机制 | 有状态 | 高 | 极高 | 高安全需求场景 |
双 Token 三验证 | 有状态 | 高 | 极高 | 高安全需求场景 |
通过 双 Token 三验证机制,系统在安全性、用户体验和灵活性之间取得了平衡,是登录鉴权模块的最佳实践方案。