1、安全刷新场景概述
大家好,我是这次课程的主讲。今天咱们先聊聊安全刷新这个场景。说实话,我最早接触这个概念时,也觉得它就是个普通的页面刷新操作。但后来在几个真实项目里踩了坑,才意识到这里面的水有多深。
什么是安全刷新
安全刷新,说白了就是用户在登录态有效期内,对页面进行重新加载或跳转时,系统能保证用户的身份信息不被篡改、不被冒用。你想想看,一个普通用户刷新页面,后端怎么知道这个请求还是同一个人发出来的?
我习惯把安全刷新拆成三个关键环节:
- 身份凭证的携带 —— 刷新时要把 token 或 session id 带过去
- 凭证的完整性校验 —— 确保凭证在传输过程中没被动手脚
- 凭证的时效性验证 —— 过期了就得重新认证
嗯,这里要注意,很多系统只做了第一点,后面两点经常被忽略。我在项目中遇到过好几次,明明 token 没丢,但刷新后用户身份就变了,查了半天才发现是完整性校验没做。
为什么需要身份防篡改
你可能会问:刷新页面而已,谁会去篡改身份?
我举个例子。之前有个电商平台,用户在结算页面刷新了一下,结果订单归属到了另一个账号。为什么?因为刷新时携带的 token 被中间人替换了。攻击者不需要拿到你的密码,只需要在你刷新的瞬间,把请求里的身份凭证换成他自己的就行。
核心结论:安全刷新场景下的身份防篡改,不是为了防止你误操作,而是为了防止攻击者在刷新这个「脆弱窗口」里实施身份劫持。
常见的风险点有三个:
- 刷新请求被拦截 —— 攻击者截获你的刷新请求,替换 token
- 本地存储被篡改 —— 攻击者通过 XSS 修改 localStorage 里的身份信息
- 服务端会话固定 —— 攻击者诱导你使用他预设的 session id
我曾经在一个金融项目里,就因为没做刷新时的身份绑定校验,被安全团队打回来三次。后来我们加了一套「设备指纹 + 用户行为特征」的校验逻辑,才算真正堵住这个漏洞。
常见攻击模型分析
咱们来看看攻击者到底是怎么下手的。我整理了几种最常见的攻击模型:
| 攻击模型 | 攻击方式 | 危害等级 | 典型场景 |
|---|---|---|---|
| Token 替换攻击 | 拦截刷新请求,替换 Authorization 头 | 高 | 公共 WiFi 环境 |
| 本地存储篡改 | 通过 XSS 修改 localStorage 中的 token | 高 | 存在 XSS 漏洞的页面 |
| 会话固定攻击 | 诱导用户使用攻击者预设的 session id | 中 | 钓鱼链接 |
| CSRF 刷新攻击 | 伪造刷新请求,利用用户已登录态 | 中 | 跨站请求伪造 |
| 重放攻击 | 截获刷新请求,重复发送 | 低 | 无时间戳校验的系统 |
这里我想重点说一下 Token 替换攻击。为什么它危害等级最高?因为攻击者不需要知道你的密码,也不需要拿到你的完整 token,他只需要在你刷新的那一刻,把请求里的 token 换成他自己的就行。你刷新完,页面显示的是你的数据,但后端认为你是攻击者——这就乱套了。
避坑指南:我曾经在一个 SaaS 项目里,发现刷新接口只校验了 token 是否有效,没校验 token 和用户 ID 是否匹配。结果攻击者只要拿到任意一个有效 token,就能冒充任何人。这个漏洞我们花了整整两周才修复干净。
下面这张图,是我画的安全刷新攻击模型全景图,你可以直观地看到攻击者都在哪些环节下手:
从这张图你能看出来,攻击者主要盯上的是两个环节:一是用户浏览器到刷新请求的路径,二是刷新请求到后端服务的路径。说白了,只要数据在网络上走一圈,就有被篡改的风险。
我的建议:在做安全刷新方案时,别只盯着加密。我见过太多团队花大量精力去搞复杂的加密算法,结果最基本的「请求来源校验」都没做。先保证基础防护到位,再考虑锦上添花。