之所以有这么多概念,是因为出来了新场景。浏览器带来了Cookie和Session,如果没有APP,Cookie就够用了…

来来来,今天我们就一直梳理下这些高频出现的名词

从浏览器便签条到企业级单点登录,完整的认证体系讲解

想象你去一家餐厅吃饭:

在这里插入图片描述

第一部分:基础概念

1. Cookie 是什么?

定义:浏览器存储的小文件,自动随每个请求发送给服务器。

工作流程

用户登录 → 服务器返回 Set-Cookie → 浏览器保存下次请求 → 浏览器自动发送 Cookie → 服务器识别用户

特点

- ✅ 自动发送(无需手动处理)

- ✅ 跨域可共享(设置 Domain)

- ❌ 容易被盗取(XSS 攻击)

- ❌ 容易被伪造(CSRF 攻击)

- ❌ 大小限制(4KB)

安全属性

Set-Cookie: sessionId=abc123 ; HttpOnly # 禁止 JavaScript 访问 ; Secure # 仅 HTTPS 传输 ; SameSite=Strict # 防止 CSRF ; Max-Age=3600 # 1 小时后过期

代码示例

// 服务器设置 Cookieresponse.addCookie(new Cookie(“sessionId”, “abc123”));
// 浏览器自动发送GET /api/user HTTP/1.1Cookie: sessionId=abc123


2. Session 是什么?

定义:服务器端存储的用户信息,通过 Cookie 中的 SessionId 关联。SessionId是Cookie中的一个属性。Cookie中存的东西可不只一个哦。

工作流程

用户登录 → 服务器创建 Session → 返回 SessionId(Cookie)下次请求 → 浏览器发送 SessionId → 服务器查询 Session → 识别用户

特点

- ✅ 安全(数据存在服务器)

- ✅ 可以存储复杂数据

- ❌ 占用服务器内存

- ❌ 分布式环境难以共享

- ❌ 需要定期清理过期 Session

分布式 Session 问题

用户登录 → 服务器 A 创建 Session
下次请求 → 负载均衡器转到服务器 B
问题:服务器 B 没有这个 Session!

解决方案:

  1. Session 复制(服务器间同步)
  2. 集中存储(Redis)
  3. 使用 Token(无状态)

代码示例:

// 服务器创建 Session
HttpSession session = request.getSession();
session.setAttribute(“userId”, 123);
session.setMaxInactiveInterval(3600); // 1 小时

// 下次请求获取 Session
HttpSession session = request.getSession(false);
if (session != null) {
Integer userId = (Integer) session.getAttribute(“userId”);
}


3. Token 是什么?

定义:服务器颁发的令牌,用户在请求中携带,服务器验证其有效性。

工作流程

用户登录 → 服务器生成 Token → 返回给客户端下次请求 → 客户端在 Header 中发送 Token → 服务器验证 Token

特点

- ✅ 无状态(服务器不需要存储)

- ✅ 支持分布式(任何服务器都能验证)

- ✅ 支持跨域(CORS 友好)

- ✅ 支持移动端(不依赖 Cookie)

- ❌ 无法主动撤销(需要黑名单)

- ❌ Token 泄露风险

在这里插入图片描述

代码示例

// 生成 Token
String token = generateToken(userId);
response.setHeader("Authorization", "Bearer " + token);

// 验证 Token
String token = request.getHeader("Authorization").replace("Bearer ", "");
if (validateToken(token)) {
    // Token 有效
}


第二部分:高级方案

  1. JWT(JSON Web Token)
    定义:一种自包含的令牌格式,包含用户信息和签名。

结构:Header.Payload.Signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

三部分解析:

Header(头部):
{
“alg”: “HS256”, # 签名算法
“typ”: “JWT” # 令牌类型
}

Payload(载荷):
{
“sub”: “1234567890”, # 用户 ID
“name”: “John Doe”, # 用户名
“iat”: 1516239022, # 签发时间
“exp”: 1516242622 # 过期时间
}

Signature(签名):
HMACSHA256(
base64UrlEncode(header) + “.” + base64UrlEncode(payload),
secret
)

优点:

  • ✅ 自包含(不需要查询数据库)

  • ✅ 防篡改(有签名验证)

  • ✅ 跨域友好

  • ✅ 移动端友好

缺点:

  • ❌ Token 大(包含所有信息)

  • ❌ 无法主动撤销

  • ❌ 泄露后无法立即失效

刷新机制:

  1. 颁发两个 Token:

    • Access Token(短期,15 分钟)
    • Refresh Token(长期,7 天)
  2. Access Token 过期后:

    • 用 Refresh Token 获取新的 Access Token
    • 无需重新登录
  3. 代码示例:

 POST /api/token/refresh
   {
     "refreshToken": "xxx"
   }

   返回:
   {
     "accessToken": "yyy",
     "expiresIn": 900
   }

5. OAuth2.0

定义:一种授权框架,允许用户授权第三方应用访问其资源。

核心概念:

资源所有者(用户)

授权服务器(微信、Google)

第三方应用(你的网站)

资源服务器(微信、Google 的 API)

四种授权方式:

1️⃣ 授权码流程(最常用)

用户点击"微信登录"

跳转到微信授权页面

用户同意授权

微信返回授权码(code)

后端用 code 换取 access_token

用 access_token 获取用户信息

登录成功

2️⃣ 隐式流程(已废弃)

直接返回 access_token(不安全)

3️⃣ 密码流程(内部系统)

用户输入用户名密码

直接返回 access_token

(仅用于内部系统,不推荐)

4️⃣ 客户端凭证流程(服务间通信)

服务 A 用 client_id + client_secret

获取 access_token

调用服务 B 的 API

代码示例:

// 1. 获取授权码
String authUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
    "appid=" + APPID +
    "&redirect_uri=" + REDIRECT_URI +
    "&response_type=code" +
    "&scope=snsapi_userinfo";

// 2. 用授权码换取 access_token
String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
    "appid=" + APPID +
    "&secret=" + SECRET +
    "&code=" + code +
    "&grant_type=authorization_code";

// 3. 用 access_token 获取用户信息
String userUrl = "https://api.weixin.qq.com/sns/userinfo?" +
    "access_token=" + accessToken +
    "&openid=" + openId;

6. SSO(Single Sign-On,单点登录)

定义:用户只需登录一次,就能访问多个相关系统。一次登录,处处访问。

SSO,是一个期望达到的业务目标,落地的方案 各个项目、各个技术栈也不全相同。

工作流程:

用户访问系统 A

重定向到 SSO 服务器

用户登录

SSO 服务器返回 Token

用户访问系统 B

系统 B 验证 Token(无需重新登录)

与 OAuth2.0 的区别
在这里插入图片描述

实现方式:

  1. 基于 Cookie:

    • SSO 服务器和各系统共享 Cookie 域名
    • 登录后 Cookie 自动发送给所有系统
  2. 基于 Token:

    • SSO 服务器颁发 Token
    • 各系统验证 Token 的有效性
  3. 基于 SAML:

    • 企业级 SSO 标准
    • 用于大型企业

代码示例:

// SSO 服务器:生成 Token
String ssoToken = generateSSOToken(userId);
response.addCookie(new Cookie("sso_token", ssoToken));

// 系统 A:验证 Token
String ssoToken = request.getCookie("sso_token");
if (validateSSOToken(ssoToken)) {
    // 自动登录
}

// 系统 B:验证 Token
String ssoToken = request.getCookie("sso_token");
if (validateSSOToken(ssoToken)) {
    // 自动登录
}

7. Sa-Token 框架

  1. Sa-Token 框架
    是什么:一个轻量级的 Java 权限认证框架,简化认证和授权。

核心功能:

  • 登录认证

  • 权限管理(RBAC)

  • Token 管理

  • 网关集成

快速开始:

<!-- pom.xml -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.37.0</version>
</dependency>

// 登录
StpUtil.login(userId);

// 检查登录
StpUtil.checkLogin();

// 获取当前用户
Long userId = StpUtil.getLoginId();

// 登出
StpUtil.logout();

// 权限检查
StpUtil.checkPermission("user:add");

// 角色检查
StpUtil.checkRole("admin");

8. 最佳实践

安全建议

  1. 使用 HTTPS(防止中间人攻击)
  2. Token 设置过期时间
  3. 敏感操作需要重新认证
  4. 定期更新密钥
  5. 使用强密码
  6. 启用 MFA(多因素认证)

性能优化

  1. Token 验证使用缓存
  2. Session 使用 Redis
  3. 避免频繁查询数据库
  4. 使用 JWT 减少服务器存储

常见坑

  1. Token 过期后没有刷新机制
  2. 没有黑名单机制(无法主动撤销)
  3. 跨域时没有正确处理 CORS
  4. 没有防止 CSRF 攻击
  5. 密钥硬编码在代码中

第四部分:面试题

高频面试题
Q1: Cookie 和 Session 的区别?

标准答案:

  1. 存储位置:

    • Cookie:浏览器
    • Session:服务器
  2. 安全性:

    • Cookie:容易被盗取(XSS、CSRF)
    • Session:相对安全
  3. 性能:

    • Cookie:无需查询
    • Session:需要查询数据库
  4. 分布式:

    • Cookie:天然支持
    • Session:需要特殊处理
  5. 大小限制:

    • Cookie:4KB
    • Session:无限制

Q2: JWT 的优缺点?

标准答案:

优点:
✅ 无状态(服务器不需要存储)
✅ 支持分布式
✅ 跨域友好
✅ 移动端友好

缺点:
❌ Token大(包含所有信息)
❌ 无法主动撤销
❌ 泄露后无法立即失效
❌ 需要刷新机制

Q3: OAuth2.0 有几种授权方式?

标准答案:

4 种:

  1. 授权码流程(最常用,在飞书官网上看到的微信登录,就是使用这种方式)
  2. 隐式流程(已废弃)
  3. 密码流程(内部系统)
  4. 客户端凭证流程(服务间通信)

Q4: SSO 和 OAuth2.0 的区别?

标准答案:

SSO(单点登录,一套技术方案):

  • 目的:认证
  • 用户:同一公司
  • 场景:内部系统
  • 例子:企业内网

OAuth2.0(授权框架):

  • 目的:授权
  • 用户:不同公司
  • 场景:第三方登录
  • 例子:微信登录

Q5: 如何选择认证方案?

标准答案:

  1. 简单应用 → Cookie + Session
  2. 分布式系统 → Token + JWT
  3. 第三方登录 → OAuth2.0
  4. 企业内网 → SSO
  5. 权限管理 → RBAC(Sa-Token)

总结

在这里插入图片描述

Spring Security

Spring 生态官方安全框架,企业级标准。
核心:认证 + 授权 + 全栈安全防护(防 CSRF、XSS、会话固定、点击劫持等)。
设计哲学:安全第一、高度可扩展、工业级健壮。

Sa-Token
国人开源(Dromara 社区),轻量级权限认证框架。
核心:登录认证 + 权限认证 + 会话管理 + SSO/OAuth2。
设计哲学:简单粗暴、一行代码搞定、少配置、低侵入。
一句话:
Spring Security = 全能重型装甲车
Sa-Token = 轻便摩托车,好骑省油

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐