跳到主要内容

认识

2025年01月07日
柏拉文
越努力,越幸运

一、认识


基于 Token 的认证 通常使用 JSON Web Token(JWT) 来代替传统的 Session IDJWT 是一种自包含的令牌,其中存储了用户的身份信息和一些其他的元数据。它是一种 无状态 的认证方式,通常用于分布式应用、API 认证等场景。

基于 JWT Token 认证 是一个 无状态认证, JWT 本身包含了所有的用户信息,服务器不需要存储会话信息,减轻了服务器压力。支持跨域请求,适合微服务架构和移动应用(Mobile App)使用。支持灵活的授权机制(如基于角色的访问控制 RBAC)。适用于 单页应用(SPA) 和 移动应用,易于与 API 配合使用。但是, JWT 的存储通常在客户端,由于其包含用户信息,如果存储不当,可能会引发 XSS 攻击等安全问题。JWT 过期后,需要重新登录或者通过 Refresh Token 来获取新的 TokenRefresh Token 需要额外管理,增加了实现复杂度。另外,JWT 存储在 LocalStorageCookie 中时,可能会遭到劫持(如 CSRF 攻击或 XSS 攻击)。

JWT(JSON Web Token) 认证模式下,主要有两种常见的 Token 存储方式:一种是服务端将 Token 存储在 Cookie 中,另一种是服务端将 Token 返回给前端,由前端将 Token 存储在 LocalStorageSessionStorage 中。这两种方式各有利弊,适用于不同的场景。

二、工作流


  1. 用户提交用户名和密码给后端服务器。

  2. 后端验证用户身份后,生成一个 JWT,该 JWT 包含用户的基本信息(如用户 ID、过期时间等)。

  3. 后端将 JWT 返回给客户端,客户端将其存储在 LocalStorageSessionStorage(对于前端应用)或 Cookie(对于传统 Web 应用)中。

  4. 客户端每次发送请求时,将 JWT 放入请求的 Authorization 头中(格式为 Bearer <token>)。

  5. 服务器验证 JWT 的有效性(如签名和过期时间),若有效,则通过 Token 识别用户身份。

三、实现方案


JWT(JSON Web Token) 认证模式下,主要有两种常见的 Token 存储方式:一种是服务端将 Token 存储在 Cookie 中,另一种是服务端将 Token 返回给前端,由前端将 Token 存储在 LocalStorageSessionStorage 中。这两种方式各有利弊,适用于不同的场景。

当用户登录成功后,服务端会生成一个 JWT,并将其设置在响应的 Set-Cookie 头中,并返回给客户端。Token 存储在 Cookie 中,并带有 HttpOnlySecure 属性(如果是 HTTPS 网站),这些属性可以增强安全性。浏览器会在每次发送请求时自动将 Cookie 中的 Token 附加在请求头中。

3.2 存储到 Storage

当用户登录成功后,服务端会生成一个 JWT Token,将其返回给前端。前端应用将该 Token 存储在 LocalStorageSessionStorage 中,通常会存储在浏览器的 LocalStorageSessionStorage 中。每次前端请求时,需要手动将 Token 添加到请求头部(通常是 Authorization: Bearer <token>)。