📜  了解登录屏幕背后的 Web 身份验证

📅  最后修改于: 2021-10-21 05:00:08             🧑  作者: Mango

身份验证是验证用户或信息身份的过程。用户身份验证是在用户登录计算机系统时验证用户身份的过程。

本文简要介绍了现代 Web 应用程序中的身份验证。

两种主要的身份验证类型是:

  • 无状态认证

  • 状态验证

要了解两者之间的显着差异,请查看无状态和有状态协议之间的差异一文。这两种类型的认证都可以通过了解它们的流程来理解。

有状态身份验证:使用会话 ID 和 Cookie。

认证流程:

  1. 用户提交登录凭据,即用户名和密码。
  2. 这是由服务器根据数据库验证的。
  3. 然后服务器生成一个临时用户会话。
  4. 服务器发出带有会话 ID 的 cookie。
  5. 用户/客户端可以随每个请求发送 cookie。
  6. 服务器根据会话存储验证它并授予访问权限。
  7. 当用户注销时,服务器会销毁会话并清除 cookie。

注意:会话 ID 只不过是一个随机字符串,服务器可以根据会话存储来识别该字符串以验证用户的请求。因此,没有第三方可以从该会话中提取任何数据/信息。

有状态认证的特点:每个用户会话都存储在服务器端(Stateful)

  • 在内存中,即文件系统(不太常见)。
  • 缓存(Redis 或 Memcached)
  • 在数据库中(常用的有 Postgres 和 MongoDb)

每个用户都由会话 ID 标识。

  1. 不透明参考:
    • 没有第三方可以提取任何数据。
    • 只有发行者(服务器)可以映射回数据。
  2. 存储在 Cookie 中:
    • 签署了一个秘密。此外,cookie 通常受标志保护,以便客户端无法篡改 cookie。在服务器端对 cookie 进行加密签名的过程也是为了避免/检测客户端对 cookie 的任何篡改,因此服务器端可以确保 cookie 没有被篡改.

无状态身份验证:使用令牌、JWT、OAuth 和其他。

使用令牌的身份验证流程:

  • 用户提交登录凭据,即用户名和密码。
  • 服务器根据数据库验证凭据。
  • 服务器然后生成一个临时 Token 并将用户数据嵌入其中。
  • 服务器用令牌(在正文或标题中)进行响应。
  • 用户将令牌存储在客户端存储 [localStorage 或 SessionStorage] 中。
  • 用户将令牌与每个请求一起发送。
  • 服务器验证令牌并授予访问权限。
  • 当用户注销时,令牌将从客户端存储中清除。

无状态认证系统的特点:

  • 令牌不存储在服务器端,只存储在客户端。(无状态)
  • 签署了一个防止篡改的秘密。
  • 已验证并且可以被服务器信任。
  • 令牌可以是不透明的或自包含的。
  • 令牌可以在其有效载荷中携带所有必需的用户数据。
  • 这可以减少数据库查找,但会将数据暴露给 XSS 攻击。
  • 令牌通常在 Authorization 标头下发送。
  • 当令牌即将到期时,可以刷新它,因为客户端会同时获得访问令牌和刷新令牌。
  • 刷新令牌可用于刷新访问令牌。
  • 用于 SPA Web 应用程序、Web API 甚至移动应用程序。