You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:09:52