1、安全刷新场景概述

大家好,我是这次课程的主讲。今天咱们先聊聊安全刷新这个场景。说实话,我最早接触这个概念时,也觉得它就是个普通的页面刷新操作。但后来在几个真实项目里踩了坑,才意识到这里面的水有多深。

什么是安全刷新

安全刷新,说白了就是用户在登录态有效期内,对页面进行重新加载或跳转时,系统能保证用户的身份信息不被篡改、不被冒用。你想想看,一个普通用户刷新页面,后端怎么知道这个请求还是同一个人发出来的?

我习惯把安全刷新拆成三个关键环节:

  • 身份凭证的携带 —— 刷新时要把 token 或 session id 带过去
  • 凭证的完整性校验 —— 确保凭证在传输过程中没被动手脚
  • 凭证的时效性验证 —— 过期了就得重新认证

嗯,这里要注意,很多系统只做了第一点,后面两点经常被忽略。我在项目中遇到过好几次,明明 token 没丢,但刷新后用户身份就变了,查了半天才发现是完整性校验没做。

为什么需要身份防篡改

你可能会问:刷新页面而已,谁会去篡改身份?

我举个例子。之前有个电商平台,用户在结算页面刷新了一下,结果订单归属到了另一个账号。为什么?因为刷新时携带的 token 被中间人替换了。攻击者不需要拿到你的密码,只需要在你刷新的瞬间,把请求里的身份凭证换成他自己的就行。

核心结论:安全刷新场景下的身份防篡改,不是为了防止你误操作,而是为了防止攻击者在刷新这个「脆弱窗口」里实施身份劫持。

常见的风险点有三个:

  1. 刷新请求被拦截 —— 攻击者截获你的刷新请求,替换 token
  2. 本地存储被篡改 —— 攻击者通过 XSS 修改 localStorage 里的身份信息
  3. 服务端会话固定 —— 攻击者诱导你使用他预设的 session id

我曾经在一个金融项目里,就因为没做刷新时的身份绑定校验,被安全团队打回来三次。后来我们加了一套「设备指纹 + 用户行为特征」的校验逻辑,才算真正堵住这个漏洞。

常见攻击模型分析

咱们来看看攻击者到底是怎么下手的。我整理了几种最常见的攻击模型:

攻击模型 攻击方式 危害等级 典型场景
Token 替换攻击 拦截刷新请求,替换 Authorization 头 高 公共 WiFi 环境
本地存储篡改 通过 XSS 修改 localStorage 中的 token 高 存在 XSS 漏洞的页面
会话固定攻击 诱导用户使用攻击者预设的 session id 中 钓鱼链接
CSRF 刷新攻击 伪造刷新请求,利用用户已登录态 中 跨站请求伪造
重放攻击 截获刷新请求,重复发送 低 无时间戳校验的系统

这里我想重点说一下 Token 替换攻击。为什么它危害等级最高?因为攻击者不需要知道你的密码,也不需要拿到你的完整 token,他只需要在你刷新的那一刻,把请求里的 token 换成他自己的就行。你刷新完,页面显示的是你的数据,但后端认为你是攻击者——这就乱套了。

避坑指南:我曾经在一个 SaaS 项目里,发现刷新接口只校验了 token 是否有效,没校验 token 和用户 ID 是否匹配。结果攻击者只要拿到任意一个有效 token,就能冒充任何人。这个漏洞我们花了整整两周才修复干净。

下面这张图,是我画的安全刷新攻击模型全景图,你可以直观地看到攻击者都在哪些环节下手:

安全刷新场景攻击模型全景图 用户浏览器 刷新请求 后端服务 攻击者 Token 替换 Token 替换攻击 拦截刷新请求 替换 Authorization 头 本地存储篡改 通过 XSS 修改 localStorage 中的 token 会话固定攻击 诱导使用预设 session id 攻击者通常在「用户 → 刷新请求」和「刷新请求 → 后端」两个环节实施攻击 其中 Token 替换攻击是最常见、危害最大的攻击方式

从这张图你能看出来,攻击者主要盯上的是两个环节:一是用户浏览器到刷新请求的路径,二是刷新请求到后端服务的路径。说白了,只要数据在网络上走一圈,就有被篡改的风险。

我的建议:在做安全刷新方案时,别只盯着加密。我见过太多团队花大量精力去搞复杂的加密算法,结果最基本的「请求来源校验」都没做。先保证基础防护到位,再考虑锦上添花。