各种登录方式梳理

一、基于 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 存储在 LocalStorageCookie 中,并在请求头中携带(如 Authorization: Bearer <token>)。
  • 服务端通过验证 Token 的签名和有效期来确认用户身份。

2. JWT 结构

JWT 由三部分组成:

  1. Header:描述 Token 类型和加密算法。
{
  "alg": "HS256",  // 加密算法
  "typ": "JWT"     // Token 类型
}
  1. Payload:存放用户信息和声明。
{
  "sub": "1234567890",  // 用户ID
  "name": "John Doe",   // 用户名
  "iat": 1516239022,    // 签发时间
  "exp": 1516242622     // 过期时间
}
  1. 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. 授权码模式流程

  1. 用户点击“第三方登录”,跳转到第三方授权页面。
  2. 用户授权后,第三方回调应用并返回授权码(Authorization Code)。
  3. 服务端用授权码向第三方换取 Access Token。
  4. 服务端通过 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。
  • 三验证
    1. Access Token 验证:每次请求验证 Access Token 是否有效。
    2. Refresh Token 验证:Access Token 过期后,使用 Refresh Token 刷新。
    3. Redis 验证:Refresh Token 存储于 Redis,确保只能使用一次。

3. 流程

  1. 用户登录
    • 生成 Access TokenRefresh Token
    • Refresh Token 存储到 Redis,设置过期时间。
    • 返回双 Token 给客户端。
  1. 请求验证
    • 客户端携带 Access Token 请求资源。
    • 服务端验证 Access Token
      • 有效:处理请求。
      • 过期:返回 401,提示客户端刷新 Token。
  1. 刷新 Token
    • 客户端使用 Refresh Token 请求新的 Token。
    • 服务端验证 Refresh Token
      • 有效:生成新的双 Token,更新 Redis。
      • 无效:返回 401,提示用户重新登录。
  1. 主动失效
    • 服务端检测到异常(如异地登录),删除 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 三验证机制,系统在安全性、用户体验和灵活性之间取得了平衡,是登录鉴权模块的最佳实践方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值