vault backup: 2026-05-24 12:43:51

This commit is contained in:
hhs
2026-05-24 12:43:51 +08:00
parent 30d312ac35
commit 910d16682b
44 changed files with 1 additions and 1 deletions
@@ -0,0 +1,210 @@
# 服务端鉴权认证方案
# 什么是鉴权
鉴权,即验证用户身份的过程。在互联网应用中,鉴权是确保只有合法用户才能访问特定资源的重要环节。鉴权方案的设计直接关系到系统的安全性和用户体验。
# 基于Token的鉴权
基于Token的鉴权方案是最常见的鉴权方式。用户在登录后,服务器会生成一个Token,并将其返回给客户端。客户端在后续的请求中,需要将Token发送给服务器,服务器会根据Token验证用户身份。
## JWT (JSON Web Token) 原理
JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。
### JWT的结构
JWT由三部分组成,每部分之间用点(.)分隔:
1. Header(头部):包含token类型和使用的算法
2. Payload(负载):包含声明(claims)信息,比如用户ID、用户名、过期时间等,Payload是JSON对象,可以包含任何数据,但是不要存储敏感信息,因为Payload是明文传输的
3. Signature(签名):用于验证token的有效性,使用Header中的算法对Header和Payload进行签名以确保token的完整性并且不可篡改
### JWT认证流程
![[Pasted image 20260518171622.png]]
## JWT的优缺点
### 优点
1. 无状态:JWT本身不存储用户信息,所有信息都存储在Payload中,因此JWT是无状态的,可以轻松实现横向扩展
2. 易于使用:JWT的结构简单,易于使用,并且可以轻松实现跨域认证
3. 易于扩展:JWT的Payload可以包含任何数据,因此可以轻松实现扩展
4. 支持跨域认证:JWT的结构简单,易于使用,并且可以轻松实现跨域认证
### 缺点
1. 无法撤销:JWT一旦生成,无法撤销。退出登录后,之前的JWT仍然有效可能被其他设备使用。
2. 无法存储敏感信息:JWT的Payload可以包含任何数据,但是不要存储敏感信息,因为Payload是明文传输的。
# 基于Session的鉴权
基于Session的鉴权方案是另一种常见的鉴权方式。服务器会为每个登录用户创建一个会话(Session),并将会话ID存储在客户端的Cookie中。
### Session认证流程
![[Pasted image 20260518172210.png]]
# 基于OAuth的鉴权
OAuth是一个开放标准的授权协议,允许用户授权第三方应用访问他们在某个服务提供商上的资源,而无需将用户名和密码提供给第三方应用。
### OAuth 2.0认证流程
![[Pasted image 20260518172239.png]]
## OAuth的优缺点
### 优点
1. 安全性:OAuth使用HTTPS协议,可以确保数据传输的安全性
2. 灵活性:OAuth可以支持多种认证方式,比如密码认证、授权码认证、客户端认证等,可以灵活选择认证方式
### 缺点
1. 复杂性:OAuth的实现相对复杂,需要处理多个步骤和状态管理
2. 用户体验:用户需要跳转到第三方平台进行授权,可能会影响用户体验
3. 依赖第三方:如果第三方服务出现问题,可能会影响自己的服务
4. 维护成本:需要定期更新和维护OAuth配置,包括密钥、回调地址等
5. 安全风险:如果实现不当,可能会存在安全漏洞,如CSRF攻击、重定向攻击等
# 基于API Key的鉴权
API Key是一种简单的鉴权方式,通常用于服务器间的通信或开发者访问API。
### API Key认证流程
![[Pasted image 20260518172321.png]]
# 登录模式
## 单点登录(SSO)
单点登录(Single Sign-On,SSO)是一种身份验证机制,允许用户使用一组凭证访问多个相关但独立的系统。用户只需登录一次,就可以访问所有已授权的系统,无需重复登录。
### SSO工作原理
![[Pasted image 20260518172400.png]]
### SSO的优势
1. 提升用户体验:用户只需登录一次即可访问所有系统
2. 降低管理成本:集中化的用户管理和认证
3. 提高安全性:统一的安全策略和审计
4. 减少密码疲劳:用户只需记住一组凭证
## 多点登录
多点登录(Multiple Login)允许用户在多个设备或浏览器上同时保持登录状态。
### 多点登录实现方案
![[Pasted image 20260518172431.png]]
### 多点登录的实现策略
1. **Token列表方式**
```go
type UserToken struct {
UserID string
Token string
DeviceInfo string
LastUsed time.Time
}
// 存储用户的所有有效Token
type TokenStore struct {
Tokens map[string][]UserToken
}
// 添加新Token
func (ts *TokenStore) AddToken(userID, token, deviceInfo string) {
newToken := UserToken{
UserID: userID,
Token: token,
DeviceInfo: deviceInfo,
LastUsed: time.Now(),
}
ts.Tokens[userID] = append(ts.Tokens[userID], newToken)
}
// 验证Token
func (ts *TokenStore) ValidateToken(token string) bool {
for _, tokens := range ts.Tokens {
for _, t := range tokens {
if t.Token == token {
return true
}
}
}
return false
}
```
2. **设备标识方式**
```go
type DeviceSession struct {
UserID string
DeviceID string
Token string
LastActive time.Time
}
// 创建或更新设备会话
func CreateDeviceSession(userID, deviceID string) *DeviceSession {
session := &DeviceSession{
UserID: userID,
DeviceID: deviceID,
Token: generateToken(),
LastActive: time.Now(),
}
return session
}
```
## 单点登录vs多点登录对比
|特性|单点登录(SSO)|多点登录|
|---|---|---|
|登录范围|多个系统间共享登录状态|同一系统多个设备登录|
|用户体验|一次登录,访问所有系统|每个设备独立登录|
|安全性|统一的安全策略|需要每个设备单独管理|
|实现复杂度|较高,需要统一认证中心|相对简单|
|会话管理|集中式管理|分散管理|
|适用场景|企业内多系统集成|消费级应用|
## 选择建议
1. **使用单点登录(SSO)的场景**:
- 企业内部多个系统需要统一认证
- 需要严格的访问控制和审计
- 用户经常需要在多个系统间切换
2. **使用多点登录的场景**:
- 消费级应用(如社交媒体、即时通讯)
- 用户需要在多个设备上同时使用
- 对用户体验要求较高的场景
# 最佳实践
1. **使用HTTPS**:无论选择哪种鉴权方案,都应该使用HTTPS保护传输层安全。
2. **Token安全**:
- 设置合理的过期时间
- 使用安全的加密算法
- 定期轮换密钥
3. **错误处理**:
- 提供清晰的错误信息
- 限制失败尝试次数
- 记录异常行为
4. **监控和日志**:
- 记录鉴权失败的情况
- 监控异常的访问模式
- 定期审计访问日志