安全
#markmap
后端安全的核心问题是「谁在访问」(认证)和「能做什么」(授权)。不同规模的项目需要不同的安全方案,从轻量的 JWT Token 到完整的 SpringSecurity 体系,再到独立的 Shiro 框架。
认证方案选型
| 方案 | 原理 | 适用场景 |
|---|---|---|
| Session + Cookie | 服务端存储会话 | 单体应用 |
| JWT | 客户端持有无状态 Token | 分布式、前后端分离 |
| OAuth2 | 第三方授权委托 | 开放平台、第三方登录 |
| SSO 单点登录 | 统一认证中心 | 企业多系统 |
Session 方案简单直接,但需要共享 Session 才能支持多节点部署。JWT 无状态,天然适合微服务,但无法主动失效,需要配合黑名单或短过期+Refresh Token 机制。
安全框架选型
| 框架 | 特点 | 适用场景 |
|---|---|---|
| SpringSecurity | 功能全面,与 Spring 深度集成 | 企业级项目 |
| Shiro | 轻量简单,学习曲线平缓 | 中小型项目 |
SpringSecurity 基于 Filter 链实现,支持细粒度的权限控制、方法级安全注解、OAuth2/OIDC 集成。Shiro 架构更直观,Subject-SecurityManager-Realm 三层结构清晰,适合快速上手。
两者都可以与 JWT 配合使用:框架负责认证授权逻辑,JWT 负责无状态 Token 传输。
安全设计原则
最小权限原则:每个用户只拥有完成工作所需的最小权限。RBAC(基于角色的访问控制)是最常用的权限模型,用户 -> 角色 -> 权限三级结构。
纵深防御:不依赖单一安全措施。网关层做认证,服务层做鉴权,数据层做脱敏。
密码存储:永远不要明文存储密码。使用 bcrypt、scrypt 或 PBKDF2 等慢哈希算法,加盐存储。MD5 和 SHA 系列因速度太快不适合做密码哈希。
HTTPS:生产环境必须使用 HTTPS,防止中间人攻击。Token、密码等敏感信息绝不能通过 HTTP 明文传输。
常见攻击与防御
| 攻击 | 原理 | 防御 |
|---|---|---|
| SQL 注入 | 恶意 SQL 拼接 | 参数绑定(#{}) |
| XSS | 注入恶意脚本 | 输入转义、CSP |
| CSRF | 伪造用户请求 | Token 验证、SameSite Cookie |
| 暴力破解 | 穷举密码 | 限流、验证码、账户锁定 |