惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
N
Netflix TechBlog - Medium
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
J
Java Code Geeks
V
Visual Studio Blog
H
Help Net Security
Engineering at Meta
Engineering at Meta
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
博客园 - 【当耐特】
B
Blog
Stack Overflow Blog
Stack Overflow Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
博客园 - 司徒正美
博客园 - 叶小钗
Y
Y Combinator Blog
MyScale Blog
MyScale Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell

李锋镝的博客

LiteLLM 本地代理搭建 Claude-HUD 使用文档 Kratos+ —— Kratos 主题二次开发记录 译文:如何将单体应用拆解为微服务 codebase-memory-mcp 极简完整使用指南 Claude Haiku 4.5、Claude Sonnet 4.6、Claude Opus 4.7 区别以及各自的新特性 SchedulingConfigurer详解 踩坑60+次后,我终于搞懂 Claude Skill 怎么写才会真的触发 Everything Claude Code 详细使用文档 配置Jackson使用字段而不是getter/setter来序列化和反序列化 这个域名注册整整十年了,十年时间,真快啊 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 Apollo配置中心中的protalDB的作用是什么 org.apache.ibatis.plugin.Interceptor类详细介绍及使用 岁末 Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法 wordpress增加说说功能 Java 为什么有这么多 “O”? 别再背线程池的七大参数了,现在面试官都这么问 2024年11月1号 农历十月初一 我的第一个WordPress插件:Dylan Custom Plugin上线了 推荐一款比较养眼的Xshell配色方案 hnswlib installation failed 开工啦~ 阳了... MybatisCodeHelperPro激活 @Async注解的坑 新买的笔记本发货啦…… 这个中秋节感觉过的好累啊 IDEA下载源码报:Cannot connect to the Maven process. Try again later.
双 Token 机制
李锋镝 · 2025-06-23 · via 李锋镝的博客

双Token机制是通过两种令牌管理用户认证与授权的方案,核心令牌包括:

  • Access Token(访问令牌)
    • 用于身份验证和授权,每次请求时携带。
    • 有效期短(如15分钟),降低泄漏风险。
  • Refresh Token(刷新令牌)
    • 用于在Access Token过期后获取新令牌。
    • 有效期长(如7天),支持无缝续期。

二、JWT 与双 Token 机制的关系

1. JWT的结构

JWT是双Token机制中Access Token的常用格式,由三部分组成:

  • Header(头部):指定令牌类型(JWT)和签名算法(如HMAC SHA256)。
  • Payload(负载):包含用户标识(sub)、过期时间(exp)、权限等声明。
  • Signature(签名):使用密钥对头部和负载签名,验证数据完整性。

2. 双Token的分工

  • Access Token:采用JWT格式,携带用户认证信息。
  • Refresh Token:独立令牌,用于刷新Access Token,通常存储于安全位置。

三、双 Token 的工作流程

  1. 用户登录

    • 用户提交用户名/密码,服务器验证通过后返回Access Token(短时效)和Refresh Token(长时效)。
  2. 正常访问流程

    • 客户端在请求头中携带Access Token(如Authorization: Bearer <token>)。
    • 服务器验证Access Token有效后,返回请求资源。
  3. Access Token过期

    • 客户端检测到Access Token过期,向服务器发送Refresh Token
    • 服务器验证Refresh Token有效,生成新的Access Token并返回。
  4. Refresh Token过期

    • 若Refresh Token失效,用户需重新登录以获取新的双Token。

四、双 Token 机制的优势

1. 提高安全性

  • Access Token存储:存于内存(如JavaScript变量),页面刷新即清空,减少持久化泄漏风险。
  • Refresh Token存储:通过HttpOnly Cookie存储,防止XSS攻击窃取令牌。

2. 无缝用户体验

  • 自动刷新Access Token,避免频繁登录,适合长会话场景(如电商、社交应用)。

3. 无状态认证

  • JWT自身携带用户信息,服务器无需存储会话状态,仅需验证Refresh Token(可选存储于数据库)。

五、如何实现双 Token 机制?

1. 生成令牌(代码示例)

const jwt = require('jsonwebtoken');

// 生成Access Token(15分钟过期)
function generateAccessToken(user) {
  return jwt.sign(
    { sub: user.id, role: user.role }, // 负载信息
    'access_secret_key', // 签名密钥
    { expiresIn: '15m' }
  );
}

// 生成Refresh Token(7天过期)
function generateRefreshToken(user) {
  return jwt.sign(
    { sub: user.id }, // 简化负载(仅需用户标识)
    'refresh_secret_key',
    { expiresIn: '7d' }
  );
}

2. 存储Refresh Token

  • 服务器端:存入数据库,关联用户ID(适合高安全场景)。
  • 客户端:通过HttpOnly Cookie存储(需配合Secure属性,避免明文传输)。

3. 验证Access Token

function verifyAccessToken(req, res, next) {
  const token = req.headers.authorization?.split(' ')[1]; // 解析Bearer Token
  if (!token) return res.status(401).json({ message: '缺少访问令牌' });

  jwt.verify(token, 'access_secret_key', (err, decoded) => {
    if (err) return res.status(403).json({ message: '令牌无效或过期' });
    req.user = decoded; // 将用户信息附加到请求对象
    next(); // 继续处理请求
  });
}

4. 刷新Access Token

function refreshTokenHandler(req, res) {
  const refreshToken = req.body.refreshToken; // 从请求体获取Refresh Token

  // 验证Refresh Token
  jwt.verify(refreshToken, 'refresh_secret_key', (err, user) => {
    if (err) return res.status(403).json({ message: '刷新令牌无效' });

    // 生成新的Access Token
    const newAccessToken = generateAccessToken(user);
    res.json({ accessToken: newAccessToken });
  });
}
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/4403