返回正文
简体中文
Web 认证方案技术指南
本文档介绍 Web 应用中常见的认证方案,包括 Session-Cookie、JWT 和 SSO 单点登录,帮助开发者理解各方案的原理、差异及适用场景。
认证方案概述
Web 认证的核心问题是:HTTP 是无状态协议,服务端如何识别用户身份?
认证 vs 授权
| 概念 | 英文 | 解决的问题 | 类比 |
|---|---|---|---|
| 认证 | Authentication | 你是谁? | 身份证 |
| 授权 | Authorization | 你能做什么? | 门禁卡 |
Session-Cookie 方案
工作原理
Session-Cookie 是传统的有状态认证方案,用户登录信息存储在服务端。
代码示例
ts
// 服务端 - Express + express-session
import session from 'express-session';
import RedisStore from 'connect-redis';
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // 仅 HTTPS
httpOnly: true, // 防止 XSS 读取
maxAge: 24 * 60 * 60 * 1000 // 24 小时
}
}));
// 登录
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = await validateUser(username, password);
if (user) {
req.session.userId = user.id;
req.session.role = user.role;
res.json({ success: true });
}
});
// 验证中间件
const authMiddleware = (req, res, next) => {
if (req.session.userId) {
next();
} else {
res.status(401).json({ error: 'Unauthorized' });
}
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
优缺点
| 优点 | 缺点 |
|---|---|
| 服务端完全控制,可随时踢人 | 需要 Session 存储( |
| Session ID 较小 | 分布式需要共享 Session |
| 安全性较高(HttpOnly) | 有 CSRF 攻击风险 |
| 实现简单成熟 | 跨域处理复杂 |
| - | 移动端 Cookie 支持有限 |
JWT 方案
什么是 JWT
JWT(JSON Web Token)是一种无状态的认证方案,用户信息编码在 Token 中,存储在客户端。
JWT 结构:Header.Payload.Signature
txt
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. <- Header (Base64)
eyJ1c2VySWQiOjEyMywiZXhwIjoxNjk5OTk5fQ. <- Payload (Base64)
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw <- Signature1
2
3
2
3
工作原理
Token 传递方式
| 方式 | 安全性 | 适用场景 |
|---|---|---|
| Authorization Header | 高 | 推荐方案,API 请求 |
| HttpOnly Cookie | 高 | 同域 Web 应用 |
| URL Query Parameter | 低 | 仅用于下载链接、邮件验证等特殊场景 |
ts
// 方式一:Authorization Header(推荐)
axios.get('/api/data', {
headers: {
'Authorization': `Bearer ${token}`
}
});
// 方式二:通过拦截器自动添加
axios.interceptors.request.use((config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
});1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Token 刷新机制
由于 JWT 无法主动失效,通常采用双 Token 机制:
ts
// 双 Token 刷新实现
interface TokenPair {
accessToken: string; // 短期,15分钟
refreshToken: string; // 长期,7天
}
// 响应拦截器 - 自动刷新
axios.interceptors.response.use(
response => response,
async error => {
if (error.response?.status === 401) {
const refreshToken = localStorage.getItem('refreshToken');
try {
const { data } = await axios.post('/auth/refresh', { refreshToken });
localStorage.setItem('accessToken', data.accessToken);
// 重试原请求
error.config.headers['Authorization'] = `Bearer ${data.accessToken}`;
return axios(error.config);
} catch {
// Refresh Token 也过期,跳转登录
window.location.href = '/login';
}
}
return Promise.reject(error);
}
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
优缺点
| 优点 | 缺点 |
|---|---|
| 无状态,天然支持分布式 | 无法主动失效(需黑名单) |
| 自包含用户信息,减少查库 | Token 较大(200+ 字节) |
| 跨域友好 | 续期机制较复杂 |
| 跨平台(Web/App/小程序) | 敏感信息不能放 Payload |
| 微服务架构友好 | XSS 可窃取(存 localStorage) |
Session vs JWT 对比
架构对比
详细对比
| 特性 | Session-Cookie | JWT |
|---|---|---|
| 状态存储 | 服务端(Redis/内存) | 客户端(Token 自包含) |
| 扩展性 | 需要共享 Session 存储 | 天然支持分布式 |
| 服务端压力 | 每次请求查询 Session | 仅验证签名,无 IO |
| 注销/踢人 | 删除 Session 即可 | 较难(需黑名单机制) |
| 安全风险 | CSRF 攻击 | XSS 攻击 |
| 跨域支持 | 需配置 Cookie | 天然支持 |
| 移动端 | Cookie 处理麻烦 | 友好 |
| Token 大小 | ~6 字节(Session ID) | ~200+ 字节 |
| 实现复杂度 | 简单 | 中等(需处理刷新) |
分布式场景对比
SSO 单点登录
什么是 SSO
SSO(Single Sign-On)单点登录:一次登录,多处访问。
常见场景
| 场景 | 说明 |
|---|---|
| Google 系 | 登录 Gmail 后,YouTube、Drive 自动登录 |
| 阿里系 | 登录淘宝后,天猫、支付宝自动登录 |
| 企业内网 | 登录 OA 后,邮箱、CRM、ERP 都能访问 |
| 微信生态 | 微信登录后,各小程序共享登录态 |
SSO 实现方案
方案一:共享 Cookie(同域)
适用于同一主域下的子系统。
ts
// 设置共享 Cookie
res.cookie('token', jwtToken, {
domain: '.example.com', // 主域名,所有子域共享
httpOnly: true,
secure: true
});1
2
3
4
5
6
2
3
4
5
6
方案二:CAS 协议(跨域)
适用于不同域名的系统。
方案三:OAuth 2.0 / OIDC
现代标准,适用于第三方登录和开放平台。
SSO 协议对比
| 协议 | 特点 | 适用场景 |
|---|---|---|
| 共享 Cookie | 简单直接 | 同域系统 |
| CAS | 经典企业方案 | 企业内部系统 |
| OAuth 2.0 | 授权协议 | 第三方登录、开放 API |
| OIDC | OAuth 2.0 + 身份层 | 现代标准方案 |
| SAML | XML 格式,企业级 | 传统企业、政府 |
SSO 与 JWT/Session 的关系
方案选型指南
决策流程图
场景推荐
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 单体应用 | Session-Cookie | 简单可靠,支持即时踢人 |
| 微服务架构 | JWT | 无状态,服务独立验证 |
| 移动端 App | JWT | 无 Cookie 限制 |
| 企业内部多系统 | SSO (CAS) | 统一认证管理 |
| 接入第三方登录 | OAuth 2.0 / OIDC | 行业标准 |
| 开放 API 平台 | OAuth 2.0 + JWT | 授权灵活,Token 自包含 |
| 高安全要求 | Session + 短期 Token | 可控性强 |
安全建议
| 攻击类型 | Session 方案 | JWT 方案 |
|---|---|---|
| XSS | HttpOnly 防护 | 避免存 localStorage,或用 HttpOnly Cookie |
| CSRF | 需要 CSRF Token | 使用 Header 传 Token 天然防护 |
| 重放攻击 | Session 过期机制 | Token 过期 + Refresh Token |
| 中间人 | HTTPS | HTTPS |
V 0.13.16 |
基于 MIT Licensed版权所有 © 2009- 2026 CMONO.NET
本站访客数
--次 本站总访问量
--人次 