Skip to content

HTTP是一个无状态的协议,那么Web应用是怎么保持用户的登录态的呢?

参考答案:

虽然 HTTP 协议本身是无状态的,即每个请求都是独立的,不会记住之前的请求状态,但 Web 应用通常需要保持用户的登录状态,这通常是通过以下几种方式来实现的:

1. Cookies

Cookies 是 Web 应用中最常见的保持登录态的方式。当用户登录成功时,后端服务器会生成一个标识用户身份的 session IDtoken,并将其保存在用户的浏览器的 Cookies 中。之后,用户每次发送请求时,浏览器会自动带上这个 Cookie,从而使服务器能够识别用户身份,保持登录状态。

工作原理

  • 用户登录:用户输入用户名和密码进行登录,后端服务器验证通过后,生成一个唯一的标识符(例如 session IDJWT token),并将其存储在用户浏览器的 Cookies 中。
  • 发送请求:用户每次发送请求时,浏览器会自动附带这个 Cookie,服务器通过 Cookie 中的标识符来识别用户身份。
  • 有效期管理:Cookie 可以设置过期时间(ExpiresMax-Age),过期后需要重新登录。

优点

  • 简单易用,浏览器会自动管理 Cookies。
  • 支持跨页面持久化登录态。

缺点

  • 受浏览器的安全策略限制,如 SameSite 限制和跨域问题。
  • 如果存储了敏感数据,可能面临被盗用的风险,必须采取适当的加密措施。

2. LocalStorage / SessionStorage

LocalStorageSessionStorage 是浏览器提供的本地存储方式,常用于存储用户登录信息(如 token)等非敏感数据。这两种存储方式的主要区别是:

  • LocalStorage:数据永久存储,直到被显式删除。
  • SessionStorage:数据仅在浏览器会话(标签页)中有效,关闭标签页或浏览器后数据丢失。

工作原理

  • 用户登录后,后端将用户身份信息(如 JWT token)返回,前端将其保存在 LocalStorageSessionStorage 中。
  • 每次发送请求时,前端将 token 从存储中读取并附加到请求头中,后端通过解析请求头来验证用户身份。

优点

  • 数据存储在客户端,不依赖于 Cookies。
  • 适用于单页面应用(SPA)中,尤其是使用 JWT token 的场景。
  • LocalStorage 可以存储大量数据。

缺点

  • 容易受到 XSS 攻击,如果攻击者能够注入恶意脚本,可能会窃取存储在浏览器中的敏感数据。
  • 不支持跨标签页和跨域的共享。

3. Session

Session 是一种传统的服务端保持状态的方法。用户登录时,后端会为每个用户分配一个唯一的 session ID,并将该 ID 存储在服务器端。当用户发送请求时,浏览器会自动带上一个包含该 session ID 的 Cookie,后端根据 session ID 查找对应的会话数据,从而识别用户的身份。

工作原理

  • 用户登录:用户登录后,服务器会创建一个 session ID 并将其存储在服务器的内存或数据库中,返回给前端一个 session ID 并存储在浏览器的 Cookie 中。
  • 后续请求:用户发送请求时,浏览器会将 session ID 自动附加到请求中,服务器通过 session ID 查找用户的会话状态。

优点

  • 安全性较高:敏感数据存储在服务器端,不易被窃取。
  • 可以在服务器端对 session 数据进行控制,如过期、销毁等。

缺点

  • 服务器负担:服务器需要存储所有活跃会话的状态,尤其是大量并发请求时,存储和管理 session 可能会增加服务器的负担。
  • 不支持跨域访问,因为每个 session ID 是与特定域名绑定的。

4. JSON Web Token (JWT)

JWT(JSON Web Token)是一种无状态的身份验证机制,常用于现代 Web 应用,尤其是分布式应用和 API 服务中。JWT 不依赖于服务器存储会话信息,而是通过加密签名的方式将用户信息和认证信息包含在 token 中,客户端(如浏览器)保存该 token,并在后续请求中携带该 token。

工作原理

  • 用户登录:用户通过用户名和密码登录,服务器验证通过后生成一个 JWT token(包含用户身份信息、过期时间等),并返回给前端。
  • 后续请求:客户端将 JWT token 保存在 LocalStorageSessionStorage 中,并将其附加到每次请求的 HTTP header(如 Authorization: Bearer <token>)。
  • 验证 token:后端通过解码 JWT token,验证其有效性并确认用户身份。

优点

  • 无状态:不需要服务器保存会话信息,每次请求都携带完整的身份验证信息。
  • 适用于分布式架构和微服务架构中的跨域认证。
  • 可以在前端存储 JWT token,并可以与第三方 API 无缝集成。

缺点

  • 安全问题:如果 JWT token 被盗,攻击者可以伪造请求,尤其是在没有使用 HTTPS 或 token 存储不当的情况下。
  • 刷新 token:JWT token 通常是无状态的,一旦过期,需要通过某种机制(如刷新 token)来处理登录过期的情况。

5. OAuth 2.0

OAuth 2.0 是一种授权框架,允许第三方应用通过授权方式访问资源,而不需要直接暴露用户的凭证。OAuth 2.0 常用于授权访问跨平台资源(如 Google、Facebook 登录),它通常结合 JWT 来实现无状态的用户认证。

工作原理

  • 用户通过第三方授权服务(如 Google)进行登录授权。
  • 第三方服务返回一个 access token 和一个 refresh token,前端使用 access token 进行 API 请求。
  • 如果 access token 过期,前端使用 refresh token 来获取新的 access token

优点

  • 允许跨平台、跨应用的授权和认证,适用于与第三方服务集成的应用。
  • refresh token 提供了自动续期机制,减少用户重新登录的次数。

缺点

  • 复杂度较高:相比传统的 session 或 JWT,OAuth 2.0 的实现和管理更复杂。
  • 安全性依赖于 token 的存储和管理。

题目要点:

Web 应用中保持用户登录态的方式,通常依赖以下几种技术:

  1. Cookies:存储在客户端,常用于服务器端维护用户会话。
  2. LocalStorage/SessionStorage:通过浏览器的本地存储保存用户的身份信息(如 token)。
  3. Session:后端维护会话状态,通过 session ID 在客户端和服务器之间传递,适用于传统 Web 应用。
  4. JWT:无状态的身份验证机制,适用于分布式和 API 驱动的应用。
  5. OAuth 2.0:授权框架,适用于跨应用和第三方服务的身份认证。