一、概念及本质
| 概念 | 本质 | 存储位置 | 主要用途 | 特点 |
|---|---|---|---|---|
| Cookie | HTTP状态管理机制 | 浏览器端 | 维持会话状态 | 自动携带,有大小限制 |
| Session | 服务端会话信息 | 服务器端 | 存储用户状态 | 服务端维护,需要管理存储 |
| Token | 访问凭证 | 客户端/服务端 | 身份认证 | 自包含,可验证,无需服务器存储状态 |
| JWT | Token标准化实现 | 客户端/服务端 | 安全传输信息 | 标准化、自包含、可签名 |
| OAuth2 | 授权框架 | 不直接存储 | 第三方授权 | 标准化授权流程,定义角色和访问令牌 |
二、工作原理和实现
1. Cookie
作用:浏览器自动带上标识,维持会话状态
示例代码:
// 设置Cookie
Cookie cookie = new Cookie("session_id", generateSessionId());
cookie.setMaxAge(3600);
cookie.setHttpOnly(true);
cookie.setSecure(true);
response.addCookie(cookie);
// 读取Cookie
@CookieValue("session_id") String sessionId
-
重要属性:
HttpOnly:防 XSS
Secure:仅 HTTPS 传输
SameSite:防 CSRF
Max-Age:有效期
2. Session
作用:服务端存储用户状态,浏览器通过 Cookie 携带 session ID
-
存储方案:
内存存储(默认)
Redis 分布式存储(适合集群)
示例代码:
// Spring Session
session.setAttribute("currentUser", user);
User user = (User) session.getAttribute("currentUser");
-
特点:
服务器状态维护
需要同步管理
适合传统 Web 应用
3. Token
作用:自包含身份凭证,服务器无需存储会话
示例代码(JWT):
String token = JWT.create()
.withIssuer("myapp")
.withSubject(user.getId())
.withClaim("username", user.getUsername())
.sign(Algorithm.HMAC256(secret));
-
特点:
无状态(stateless)
可放在 Header、Cookie 或 URL
适合前后端分离、移动端
4. JWT(JSON Web Token)
结构:
header.payload.signature示例:
// Header
{"alg":"HS256","typ":"JWT"}
// Payload
{"sub":"123","name":"John Doe","iat":1516239022,"exp":1516242622}
// Signature
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload), secret)
-
最佳实践:
安全存储:HttpOnly Cookie 或内存
双Token机制:Access Token(短期) + Refresh Token(长期)
5. OAuth2
作用:第三方授权框架
-
角色:
Resource Owner(用户)
Client(第三方应用)
Authorization Server(颁发令牌)
Resource Server(托管资源)
授权流程:常用授权码模式(Authorization Code)
示例(Spring Security OAuth2):
// 授权服务器配置
clients.inMemory()
.withClient("clientapp")
.secret(passwordEncoder.encode("123456"))
.authorizedGrantTypes("authorization_code","refresh_token")
.scopes("read","write")
.redirectUris("http://localhost:8080/callback");
三、应用场景对比
| 场景 | 推荐方案 | 说明 |
|---|---|---|
| 传统 Web 应用 | Session + Cookie | 简单易用,生态成熟 |
| 前后端分离 | JWT | 无状态 API 认证,跨域友好 |
| 第三方登录 | OAuth2 | 标准化授权流程,安全可靠 |
| 微服务架构 | JWT | 分布式认证,无需会话同步 |
| 移动端 | Token | 轻量、适合移动网络 |
四、安全考虑
| 威胁 | Cookie方案防护 | Token/JWT防护 |
|---|---|---|
| XSS | HttpOnly | 避免 localStorage 存储 |
| CSRF | SameSite Cookie | 自定义 Header + CSRF Token |
| 令牌泄露 | 短期有效 + HTTPS | 短期有效 + HTTPS + 刷新机制 |
| 数据篡改 | 服务端验证 | 签名验证 |
五、总结
Cookie:HTTP 状态管理载体
Session:服务端状态信息
Token:自包含身份凭证
JWT:Token 标准化实现
OAuth2:授权框架
选择原则:
简单 Web 应用 → Session + Cookie
前后端分离 → JWT + HTTP Header
第三方授权 → OAuth2 + JWT
没有绝对的最佳方案,只有最适合的方案。理解本质和适用场景才能做出正确架构决策。