本文档涵盖了系统设计中与安全相关的概念和机制,重点关注身份验证、授权和 Web 应用程序中常见的安全威胁。有关网络特定安全威胁和对策的信息,请参阅网络安全(计算机基础)。
身份验证和授权是安全的基本概念,它们经常被混淆,但在系统安全中扮演着不同的角色。
身份验证示例

授权示例

来源: docs/system-design/security/basis-of-authority-certification.md8-30
基于角色的访问控制(RBAC)模型是系统权限管理中最常用的访问控制模型。
RBAC 创建了一个“用户-角色-权限”的授权模型,其中
这种方法通过将单独的权限抽象为角色,大大简化了权限管理。
RBAC 的典型数据库设计包括以下表
来源: docs/system-design/security/basis-of-authority-certification.md32-53
在请求之间维护用户身份的传统方法是使用会话和 cookie。
工作原理
Session-Cookie 在分布式系统中的挑战
来源: docs/system-design/security/basis-of-authority-certification.md54-170
JSON Web Token (JWT) 是一种流行的基于令牌的身份验证替代方案,它解决了基于会话的身份验证的一些限制。
JWT 结构
Header:包含关于令牌类型和签名算法的元数据
Payload:包含声明(关于用户和附加数据的陈述)
Signature:通过使用密钥对编码的 Header 和 Payload 进行签名而创建
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
来源: docs/system-design/security/jwt-intro.md10-127 docs/system-design/security/advantages-and-disadvantages-of-jwt.md15-52
| 方面 | JWT | 会话 |
|---|---|---|
| 状态管理 | 无状态(不需要服务器端存储),可提高可扩展性 | 有状态(会话数据存储在服务器上) |
| 存储 | 客户端(localStorage、sessionStorage) | 服务器端(Cookie 中带有 SessionID) |
| 可扩展性 | 更适合分布式系统 | 需要会话同步 |
| 安全 | 不易受 CSRF 攻击,但易受 XSS 攻击 | 如果使用 Cookie,则容易受到 CSRF 攻击 |
| 大小 | 体积较大 - 包含所有必要信息 | 体积较小 - 仅包含 SessionID |
| 撤销 | 在过期前很难撤销 | 易于失效 |
| 移动/API | 非常适合移动应用和 API | 不太适合移动应用 |
来源: docs/system-design/security/advantages-and-disadvantages-of-jwt.md14-92
挑战 1:JWT 撤销
由于 JWT 是无状态的,并且在过期前都有效,因此在以下场景中很难使其失效:
解决方案
挑战 2:JWT 更新
出于安全考虑,JWT 应具有有限的生命周期,但这会产生对更新机制的需求。
解决方案:刷新令牌模式
挑战 3:JWT 体积
JWT 可能变得很大,增加网络开销。
解决方案
来源: docs/system-design/security/advantages-and-disadvantages-of-jwt.md94-190
IP 欺骗是一种攻击者伪造源 IP 地址来冒充另一个主机的技术。这可以用于
缓解措施:在网络边界实施入口和出口过滤,以验证数据包源地址。
来源: docs/cs-basics/network/network-attack-means.md12-40
SYN Flood 攻击通过发送大量 SYN 数据包但不完成握手来利用 TCP 三次握手。
缓解技术:
来源: docs/cs-basics/network/network-attack-means.md42-98
HTTP Flood 攻击通过向 Web 服务器发送大量看似合法的 HTTP GET 或 POST 请求来攻击 Web 服务器。
类型:
缓解:
来源: docs/cs-basics/network/network-attack-means.md127-150
CSRF 攻击会诱使用户在已登录的网站上执行不需要的操作。
攻击示例
JWT 如何帮助防止 CSRF:当 JWT 存储在 localStorage 中(而不是 Cookie 中)时,恶意网站无法在伪造的请求中包含 JWT。
基于会话的身份验证的缓解措施:
来源: docs/system-design/security/basis-of-authority-certification.md179-203
在中间人 (MITM) 攻击中,攻击者秘密地拦截并可能篡改两个通信方之间的通信。
缓解:
来源: docs/cs-basics/network/network-attack-means.md247-406
使用强密码策略
实施多因素身份验证
JWT 安全
Session 安全
来源: docs/system-design/security/jwt-intro.md158-167
实施最小权限原则
使用 RBAC 进行权限管理
对每个请求验证授权
审计访问和更改
来源: docs/system-design/security/basis-of-authority-certification.md32-53
实施适当的 DDoS 防护
处处使用 HTTPS
实施纵深防御
定期更新和修补系统
来源: docs/cs-basics/network/network-attack-means.md426-462
OAuth 2.0 是一种授权协议,它允许第三方应用程序代表用户访问资源,而无需暴露凭据。
OAuth 2.0 常用于
来源: docs/system-design/security/basis-of-authority-certification.md229-249
SSO 允许用户进行一次身份验证,然后访问多个关联系统,而无需重新进行身份验证。
SSO 的优势
来源: docs/system-design/security/basis-of-authority-certification.md213-227