前端面试 P096:令牌无感刷新、重试与安全边界
来源:方格前端讲面试 · 前端如何实现token的无限刷新,21 分 15 秒。
回看定位:00:41 核心流程 · 01:50 双令牌 · 04:56 并发 · 19:23 错误恢复
短期访问与刷新凭据
访问令牌用于访问 API,刷新凭据用于续期;有效时间、轮换、撤销和会话结束由服务端策略决定。视频中的十五分钟、七天只是示例,不是协议固定值,也不意味着可以无限刷新。
一次过期请求的完整路径
先按约定识别访问令牌过期,再经专用刷新流程获取新凭据,更新后重试原请求。刷新失败应结束会话或按业务恢复,让所有等待者失败;不可把 Promise 永远挂住。
HTTP 401 与业务 code 是不同层级,不要把应用自定义四位数 code 当成合法的任意 HTTP status。403、网络错误也不应一律解释成“令牌过期,刷新一下”。
防止死循环和重复副作用
刷新端点不能再递归走同一过期刷新逻辑;原请求设置最多重试次数。请求体可能是一次性流、文件或已执行的非幂等操作,不能默认任何请求都可无条件重放,需服务端配合幂等键和一致的认证处理顺序。
多个同时过期的请求应共享一次刷新,详细实现见 前端面试 P096:共享刷新 Promise 与并发失败恢复。
凭据存储与轮换
localStorage 中的凭据可被同源脚本读取;应根据架构比较内存访问令牌、HttpOnly/Secure/SameSite Cookie、CSRF 与跨域凭据策略。没有一种前端存储写法自动解决全部威胁。
服务端轮换 refresh token 时应原子保存新返回值,不能把旧变量再次写回。跨标签页还要考虑共享刷新竞争和退出登录同步,单页面布尔标志并不能全包。
退出期间仍在进行的刷新,不应完成后悄悄恢复已撤销的登录状态;使用会话版本或有效性检查。视频核心流程可用,补足这些边界后才接近可复用请求层。