认证是验证用户或信息身份的过程。用户身份验证是在用户登录到计算机系统时验证用户身份的过程。
本文简要介绍了现代Web应用程序中的身份验证。
身份验证的两种主要类型是:
-
无状态验证
-
状态验证
要了解它们之间的重大区别,请查看“无状态协议与有状态协议之间的区别”一文。可以通过了解两种身份验证的流程来理解这两种身份验证。
状态验证:使用会话ID和Cookies。
认证流程:
- 用户提交登录凭据,即用户名和密码。
- 服务器已针对数据库对此进行了验证。
- 然后,服务器生成一个临时用户会话。
- 服务器发出带有会话ID的cookie。
- 用户/客户端可以随每个请求发送cookie。
- 服务器根据会话存储对其进行验证并授予访问权限。
- 当用户注销时,服务器破坏会话并清除cookie。
注意:会话ID只是一个随机字符串,服务器可以根据会话的存储区识别该随机字符串以验证用户的请求。因此,没有第三方可以从该会话中提取任何数据/信息。
状态验证的特征:每个用户会话都存储在服务器端(状态) 。
- 内存中,即文件系统(较少见)。
- 缓存(Redis或Memcached)
- 在数据库中(常用的包括Postgres和MongoDb)
每个用户由会话ID标识。
- 不透明参考:
- 没有第三方可以提取任何数据。
- 只有发行者(服务器)可以映射回数据。
- 存储在Cookie中:
- 秘密签名。同样,cookie经常受标志保护,以使客户端无法篡改cookie。整个目的还包括对服务器端的cookie进行加密签名的过程,以避免/检测到客户端对cookie的任何篡改,因此服务器端可以确保cookie未被篡改。 。
无状态身份验证:使用令牌,JWT,OAuth和其他。
使用令牌的认证流程:
- 用户提交登录凭证,即用户名和密码。
- 服务器根据数据库验证凭据。
- 然后,服务器生成一个临时令牌并将用户数据嵌入其中。
- 服务器使用令牌(在主体或标头中)进行响应。
- 用户将令牌存储在客户端存储中[localStorage或SessionStorage]。
- 用户将令牌与每个请求一起发送。
- 服务器验证令牌并授予访问权限。
- 当用户注销时,令牌将从客户端存储中清除。
无状态身份验证系统的功能:
- 令牌不存储在服务器端,而仅存储在客户端。(无状态)
- 签名并带有防止篡改的秘密。
- 已验证并且可以被服务器信任。
- 令牌可以是不透明的或独立的。
- 令牌可以在其有效负载中携带所有必需的用户数据。
- 这样可以减少对数据库的查找,但会将数据暴露给XSS攻击。
- 令牌通常在Authorization标头下发送。
- 当令牌即将到期时,可以对其进行刷新,因为向客户端同时颁发了访问令牌和刷新令牌。
- 刷新令牌可用于刷新访问令牌。
- 用于SPA Web应用程序,Web API甚至移动应用程序。