Angular+SpringBoot JWT登录安全:如何防范伪造token越权访问
解决Angular+SpringBoot JWT登录的身份伪造问题
问题背景
我在基于Angular与SpringBoot的JWT登录体系中,登录后会把token和userRole存在localStorage里。但测试发现,手动在浏览器里给localStorage塞个随机token,居然能直接访问受限页面。当前的前端身份验证方法如下:
isAuthenticated():boolean{ const token = localStorage.getItem('token'); return !!token; }
我考虑登录后把token存进数据库,通过对比数据库与localStorage里的token来验证身份,想知道怎么落地这个方案,或者有没有更合适的解决办法?
核心问题分析
当前前端的isAuthenticated()只是简单检查localStorage里有没有token,完全没有验证token的合法性——这就是随便塞个假token就能绕过的根本原因。先补上token合法性校验的逻辑,才是解决问题的核心,数据库存token是额外的会话增强手段。
分步解决方法
1. 前端先补全token合法性校验
别只检查token是否存在,要验证它的签名、过期时间:
import jwtDecode from 'jwt-decode'; isAuthenticated(): boolean { const token = localStorage.getItem('token'); if (!token) return false; try { const decodedToken: any = jwtDecode(token); // 检查token是否过期 const isExpired = Date.now() >= decodedToken.exp * 1000; return !isExpired; } catch (error) { // 解码失败说明是无效token,直接清空存储 localStorage.removeItem('token'); localStorage.removeItem('userRole'); return false; } }
注:需要安装jwt-decode包,或者自己实现JWT解码逻辑,核心是解析出exp字段判断过期时间
2. 后端加token有效性强制校验(必做)
前端校验只是第一道防线,真正的安全必须靠后端:
- 所有受限接口都要校验请求头里的JWT:验证签名是否正确、是否过期、Claims(比如userID、role)是否合法
- 用Spring Security的话,可以自定义JWT过滤器,在过滤器里完成上述校验,无效直接返回401状态码
3. 数据库存token实现会话管理(可选)
如果需要支持主动踢用户下线、限制单端登录,可以把token存入数据库:
- 登录时:生成JWT后,将
token、user_id、expire_time、device_info等字段存入数据库 - 后端校验token时:除了验证JWT本身,还要查询数据库确认该token存在且未被标记失效
- 登出时:从数据库删除对应token,同时前端清空localStorage
- 定期清理数据库中的过期token(可以用Spring的定时任务实现)
4. 额外安全优化
- 优先把token存在
HttpOnly的Cookie里,而非localStorage,避免XSS攻击窃取token(同域部署场景适用) - 生成JWT的签名密钥要用强密钥,别用简单字符串
- 前端路由守卫里,除了调用
isAuthenticated(),最好再发起一个后端校验接口(比如/api/auth/verify),二次确认token有效性
内容的提问来源于stack exchange,提问作者user29415755
相关产品推荐
相关产品推荐

