当前位置: 首页 > news >正文

为什么要设计access_token和refresh_token

将访问令牌(Access Token)和刷新令牌(Refresh Token)分开设计是现代认证授权体系(尤其是OAuth 2.0)中的核心安全实践,主要为了解决以下几个关键问题:

  1. 限制访问令牌泄露的危害:​

    • 问题:​​ 访问令牌是用来访问受保护资源(如API、用户数据)的凭证。如果它被泄露(例如,通过网络窃听、XSS攻击、恶意软件或日志文件暴露等),攻击者就可以冒充用户进行所有授权操作。
    • 解决方案:​​ 让访问令牌拥有很短的有效期​(几分钟到几小时)。这样,即使它被窃取,攻击者也只能在这个短暂的窗口期内滥用它。过期后令牌就失效了,攻击力大大降低。
  2. 提升安全性同时保持用户体验:​

    • 问题:​​ 如果仅靠短生命期的访问令牌,用户会频繁地被要求重新登录以获取新令牌,体验极差。
    • 解决方案:​​ 引入刷新令牌。​刷新令牌的生命周期比访问令牌长得多​(几天、几周、甚至几个月或更长)。当访问令牌过期后,​客户端可以使用刷新令牌(而不是用户密码)在后台、无需用户交互地获取一组新的访问令牌和刷新令牌。用户只需在刷新令牌过期或首次登录时才需要输入凭证,避免了频繁登录的麻烦。
  3. 分离权限和控制范围:​

    • 问题:​​ 将所有功能都赋予同一个令牌会增加风险,攻击者拿到这个令牌能做太多事情。
    • 解决方案:​
      • 访问令牌 (Access Token):​​ 主要用来访问特定资源。它包含权限范围(scope)信息,指定了令牌持有者可执行的操作或可访问的数据。它通常不包含用户凭证,且有效期极短。
      • 刷新令牌 (Refresh Token):​​ ​唯一的作用就是获取新的访问令牌(和可选的新的刷新令牌)​。它本身不携带访问资源的权限,只用于续期操作。获取新令牌的过程通常需要认证客户端的身份(client id/secret)并绑定之前的会话(如关联用户)。
  4. 允许更安全的令牌存储策略:​

    • 访问令牌:​​ 由于其短生命周期和高访问频率,它通常存储在相对“不安全”但访问速度快的位置,如Web浏览器的Memory、本地Storage(但需权衡XSS风险)。
    • 刷新令牌:​​ 由于其长期有效性和获得新访问令牌的强大能力,必须更安全地存储。在Web应用中,最佳实践是使用HttpOnly、Secure、SameSite=Strict/Lax的Cookie来存储,防止JavaScript访问(对抗XSS)。在原生应用中,应使用操作系统提供的安全凭证存储机制。
  5. 提高可撤销性(Revocation)和可控性:​

    • 问题:​​ 如果只有长生命期的令牌,一旦需要吊销(如用户举报、检测到异常活动),直接吊销主令牌会立即完全中断用户的会话。
    • 解决方案:​
      • 吊销单独的访问令牌影响很小,因为它马上要过期了。
      • 如果需要彻底终止会话(如用户退出、检测到可疑访问),​服务器可以主动撤销刷新令牌。一旦刷新令牌被标记为失效,客户端就无法再获取新的访问令牌,所有依赖该刷新令牌的会话都会终止。这种细粒度控制非常有用。实现上,认证服务器需要维护已撤销刷新令牌的列表(Blacklist/Revocation list)或在令牌签发时将其状态记录在数据库中。
  6. 减少关键凭证的传输:​

    • 用户最关键的凭证(用户名/密码)仅在初始登录或授权时使用一次。
    • 后续令牌的刷新只使用刷新令牌和客户端凭据,不再传输用户密码。这降低了密码在网络或客户端存储中被暴露的风险。

总结来说:​

  • 访问令牌 (Access Token):​​ 是你的短期通行证。它可以让你进入建筑(访问资源),但很快就会过期(例如1小时)。丢失了风险有限。
  • 刷新令牌 (Refresh Token):​​ 是你的长期续卡凭证。它不能让你直接进入建筑(不能访问资源),但可以在你的通行证快过期时,拿去一个特定的窗口(认证服务器),​在管理员确认后(验证客户端和关联关系)​,换取一张新的短期通行证和一张新的续卡凭证。这张续卡凭证本身是被严格保管的。

这种分离设计完美地平衡了三个核心要素:​安全性(限制攻击影响范围、便于吊销)​用户体验(减少频繁登录)​实用性(后台自动化更新令牌)​。它是现代认证授权体系的基石之一。

http://www.lqws.cn/news/540613.html

相关文章:

  • Netty入门案例:简单Echo服务器(同步)
  • 航天VR赋能,无人机总测实验舱开启高效新篇​
  • 探秘 VR 逃生救援技术的奇妙世界​
  • 自动化保护 AWS ECS Fargate 服务:使用 Prisma Cloud 实现容器安全
  • Linux工作常用命令记录
  • 系统学习 Android 的 进程管理、内存管理、音频管理
  • 【人工智能与机器人研究】基于改进长短焦图像融合技术的轨道交通障碍物检测系统研究
  • 飞凌A40i使用笔记
  • 【RAG面试题】LLMs已经具备了较强能力,存在哪些不足点?
  • 命名数据网络 | 签名(Signature)
  • 电力微气象在线监测系统:温湿度 / 风速 / 气压多要素监测
  • ROS:录制相机、IMU、GNSS等设备数据
  • AI+实时计算如何赋能金融系统?DolphinDB 在国泰君安期货年度中期策略会的演讲
  • JetBrains AI助手登陆Android Studio!智能编码提升Kotlin开发效能
  • AI+物联网:从万物互联到万物智联
  • Spring 框架中@Resource和@Autowired是用于实现依赖注入的两个重要注解,及@Primary注解
  • 代码随想录|图论|09沉没孤岛
  • vue项目中纯前端实现导出pdf文件,不需要后端处理。
  • 论基于架构的软件设计方法(ABSD)及应用
  • Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要区别
  • 【ubuntu24.04】忘了自己把开机samba挂载的脚本放哪里了
  • 【C++特殊工具与技术】固有的不可移植的特性(3)::extern“C“
  • Python实例题:文件内容搜索工具
  • 学习记录:DAY34
  • 树的重心(双dfs,换根)
  • 目标跟踪存在问题以及解决方案
  • 算法第54天| 并查集
  • 【Redis】解码Redis中的list类型,基本命令,内部编码方式以及适用的场景
  • 分布式ID生成SnowflakeId雪花算法和百度UidGenerator工具类
  • 深入解析:Vue 中的 Render 函数、JSX 与 @vitejs/plugin-vue-jsx 实践指南