无感刷新的秘密:Access Token 和 Refresh Token 的那些事儿


无感刷新的秘密:Access Token 和 Refresh Token 的那些事儿

在现代 Web 开发中,用户的身份认证和授权是一个绕不开的话题。为了保证安全性,我们通常会使用 token-based 认证机制,其中 Access Token 和 Refresh Token 是实现"无感刷新"体验的关键。今天我们就从 HTTP 请求的角度,聊聊这两者的工作原理和续期逻辑。

一、一般情况下的 HTTP 请求是什么样子?

假设你已经登录了一个网站,服务端返回了 Access Token 和 Refresh Token(通常在登录成功后的响应中)。Access Token 是短期有效的凭证,用于访问受保护的资源。

在日常操作中,比如你想获取用户个人信息,客户端会发起一个这样的 HTTP 请求:

sql 复制代码
GET /api/user/profile HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  • 关键点 : - Authorization 头携带了 Access Token,格式通常是 Bearer <access_token>。 - 服务端验证这个 token 是否有效(未过期、签名正确等),如果通过,就返回对应的数据,比如: json { "username": "Alice", "email": "alice@example.com" }

这种请求是无感知的,用户只需要正常操作,客户端会自动带上 Access Token。

二、续期情况下的 HTTP 请求长啥样?

Access Token 通常有效期较短(比如 15 分钟或 1 小时),一旦过期,客户端就无法直接访问资源了。这时候,Refresh Token 上场,它是一个长期有效的凭证,专门用来换取新的 Access Token。

当 Access Token 过期,客户端会发起一个续期请求,典型的 HTTP 请求如下:

bash 复制代码
POST /api/auth/refresh HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
  • 关键点 : - 请求通常是 POST 类型,携带 Refresh Token。 - 服务端验证 Refresh Token 是否有效(未过期、未被撤销等),如果通过,会返回新的 Access Token(有时还会返回新的 Refresh Token): json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expires_in": 3600 }

客户端拿到新的 Access Token 后,保存下来,后续请求继续使用新的 Access Token,无需用户重新登录。这就是"无感刷新"的核心:用户完全察觉不到 token 的切换。

三、什么时候会发生续期?怎么判定要续期?

续期并不是随便发生的,它有明确的触发条件和判定逻辑。以下是常见的场景和方法:

  1. 什么时候发生续期? - Access Token 过期 :最常见的情况是 Access Token 到期。比如有效期是 1 小时,过了这个时间,服务端会返回 401 Unauthorized。 - 主动提前续期:为了避免用户请求失败,很多客户端会在 Access Token 快过期时(比如剩余 5 分钟)主动发起续期。

  2. 怎么判定要续期? - 服务端返回 401 :客户端发送请求时,如果收到 401 状态码,通常意味着 Access Token 已失效,需要用 Refresh Token 去换新的。 - 客户端时间检查 :Access Token 通常会带上 expires_in(有效期,单位秒)。客户端可以解析 token 或记录下到期时间,提前判断是否需要续期。 - 比如,假设当前时间是 10:00,token 的到期时间是 10:15,客户端可以在 10:10 时提前发起续期请求。 - JWT 自解析 :如果 Access Token 是 JWT 格式,客户端可以直接解析其 exp(过期时间)字段,计算是否需要续期。

  3. 无感刷新的实现: - 客户端通常会设置一个拦截器(interceptor)。每次请求前检查 Access Token 是否有效,快过期就先调用刷新接口;收到 401 时也自动触发刷新流程。 - 用户完全无感知,因为这些操作都在后台默默完成。

总结

通过 Access Token 和 Refresh Token 的配合,我们实现了安全与用户体验的平衡: - Access Token :短命,负责日常请求,过期后失效。 - Refresh Token :长寿,负责续期,保障无感体验。 - 续期逻辑:要么被动(401 触发),要么主动(提前检查),客户端聪明地处理一切。

下次你刷网页、用 App 时,如果没有频繁弹出登录框,不妨感谢一下这对 token 兄弟的幕后努力吧!

相关推荐
C++业余爱好者2 小时前
ModuleNotFoundError: No module named ‘flask‘ 错误
后端·python·flask
Yvette-W3 小时前
【React】List使用QueueAnim动画效果不生效——QueueAnim与函数组件兼容性问题
前端·javascript·react.js·前端框架·list
zy0101014 小时前
JSX入门
前端·css·react.js·html·jsx
Blue.ztl4 小时前
菜鸟之路Day25一一前端工程化(二)
开发语言·前端·javascript
kkk哥4 小时前
基于springboot的星之语明星周边产品销售网站(050)
java·spring boot·后端
阿珊和她的猫4 小时前
Vue.js的ref:轻松获取DOM元素的魔法
前端·javascript·vue.js
萌萌哒草头将军6 小时前
⚡⚡⚡Vite 被发现存在安全漏洞🕷,请及时升级到安全版本
前端·javascript·vue.js
Asthenia04126 小时前
面试官问我怎么做分库分表?这是一份全面的实战解答
后端
小兵张健7 小时前
运用 AI,看这一篇就够了(上)
前端·后端·cursor
Asthenia04127 小时前
使用RocketMQ的本地消息表+事务消息/普通消息方案实现分布式事务
后端