身份验证从零到英雄 (▀̿Ĺ̯▀̿ ̿) | 第一部分
验证
身份验证类型
状态认证
无状态身份验证
结论
验证
首先关注“什么”。
好吧。🤨!但这对我来说有点难。让我们用一个简单的例子来理解。例如,你是谢尔顿·库珀,你去银行取钱。你对收银员说给我 5000 美元,他们说“你是谁?我不认识你,所以我不能给你”。发生这种情况是因为他们不认识你,无法识别你是银行账户的真正持有人。他们提供了银行账号和密码/签名来识别你。当你把这些信息告诉收银员时,他会说“谢谢!库珀先生,这是你的 5000 美元”。这表明,通过提供这些信息,可以识别你是银行账户的真正持有人。因此,验证用户或进程身份的过程或操作就是身份验证。
身份验证类型
- 有状态的
- 基于 Cookie/会话的身份验证。
- 无国籍
- 基本身份验证
- 智威汤逊
- OpenID 连接
状态认证
状态身份验证是一种通过让服务器或后端存储大量会话信息(例如用户属性)来验证用户身份的方法。
在此方法中,每当客户端向服务器发出请求时,请求都会携带服务器在身份验证时提供的唯一 ID,并将此 ID 与其身份提供商 (IdP) 进行匹配。
由于服务器必须存储用户的会话信息,状态身份验证也称为基于会话的身份验证或基于 Cookie 的身份验证。
优势
- 随时撤销会话。
- 易于实施和管理。
缺点
- 增加服务器开销:随着登录用户数量的增加,占用的服务器资源越多。
- 服务器必须存储会话 ID,这限制了可扩展性。
无状态身份验证
无状态身份验证是一种通过将用户数据存储在客户端并使用某种加密签名进行签名来验证用户身份的方法。这些签名数据被称为令牌。每当客户端尝试请求服务器时,服务器都会验证签名的令牌,检查其是否有效。
优势
- 易于扩展
- 降低服务器开销:服务器不必为客户端分配资源。
缺点
- 无法随时撤销会话:由于令牌存储在客户端,因此服务器无权删除会话。
- 实施起来相对复杂:增加了实施时的技术复杂性。
- 如果令牌在到期前被盗,并被黑客利用,服务器将无法识别。因此,令牌的有效期应该较短(<=15分钟)。
有状态的 | 无国籍 | |
---|---|---|
会话信息可能被窃取 | ✅ 不可能从会话标识符中窃取会话信息,因为它只是与会话关联的标识符 | ❌ 会话标识符包含所有身份验证信息,并且有可能窃取敏感信息,因为它未加密。 |
资源消耗 | ✅ 在检索会话信息时,服务总是会访问会话存储,这会导致额外的资源消耗。 | ❌ 会话标识符包含所有会话信息。 |
易于实施 | ✅当会话信息存储在外部数据库中时,需要实现会话数据库持久化 | ❌会话标识符包含所有会话信息,无需实现额外的功能 |
易于扩展 | ❌在添加新实例时,还需要对会话存储进行额外的扩展 | ✅添加新的服务实例不需要额外的努力 |
身份验证令牌大小 | 🤏这只是一个标识符,所以尺寸很小 | 🥵 它包含大量数据,身份验证令牌也会变大 |
限制应用程序不同部分之间的访问 | ✅可以配置系统,以便系统的不同部分只能访问其工作所需的数据 | ❌系统的所有部分都可以访问所有会话数据 |
撤销会话的可能性 | ✅可以随时撤销会话 | ❌由于会话令牌包含到期日期,因此无法撤销身份验证会话 |
结论
两种方法都有意义,各有优缺点。无状态身份验证更易于实现和扩展,但有状态身份验证更安全且更易于管理。在下一部分中,我们将了解每种身份验证方式,例如 JWT、Cookie、OAuth 等。👋🏻