手撕JWT执行流程:从登录到鉴权的技术探析

360影视 欧美动漫 2025-03-25 08:39 3

摘要:当用户在前端输入账号密码时,这场技术大戏的帷幕才真正拉开。以我去年参与的电商项目为例,登录接口收到请求后,先用BCrypt算法对比数据库中的密码哈希值——这玩意儿可比MD5安全得多,就算被拖库也能扛住彩虹表攻击。

当用户在前端输入账号密码时,这场技术大戏的帷幕才真正拉开。以我去年参与的电商项目为例,登录接口收到请求后,先用BCrypt算法对比数据库中的密码哈希值——这玩意儿可比MD5安全得多,就算被拖库也能扛住彩虹表攻击。

验证成功后,服务端就像个精明的会计,开始组装JWT的三联单:

Header:固定写入HS256算法和JWT类型,像快递单上的"易碎品"标识Payload:除了用户ID、角色等基础信息,必须塞进exp过期时间戳——我吃过没设失效期的亏,某次测试账号被盗用,差点被甲方爸爸骂成筛子Signature:用服务端密钥对前两部分进行HMAC-SHA256签名,这步骤就像给快递贴防拆封条,篡改立刻现形生成的Token形如xxxxx.yyyyy.zzzzz,通过响应体返回前端。这里有个冷知识:用HttpOnly的Cookie存储比localStorage更稳当,能防XSS偷袭。

客户端拿到Token后,就像揣着电子粮票进供销社。以我们团队自研的React后台管理系统为例,每次调用API都要在axios拦截器里搞事情:

JavaScriptaxios.interceptors.request.use(config => { config.headers.Authorization = `Bearer ${localStorage.getItem('token')}` return config})

这个Bearer前缀可不是摆设,它告诉服务端:"我带的是正经令牌,不是阿猫阿狗"。去年双十一大促时,某个新同事忘了加这个前缀,直接导致网关把2000+QPS的请求全给拒了,吓得运维组差点集体吃救心丸。

当请求抵达Spring Security的JwtFilter时,真正的技术showtime才开始。验证流程分三步走,比重庆火锅的九宫格还要讲究:

拆包验货:用split("\\.")把Token大卸三块,要是拆不出三段直接打回原形签名鉴伪:拿服务端密钥重新计算签名,和第三段比对——这招专治各种PS高手时效审查:检查exp是否大于当前时间戳,过期的Token比隔夜茶还不如

记得有次渗透测试,白帽子小哥伪造了个过期时间戳想浑水摸鱼,结果被我们自研的熔断机制当场抓获。后来复盘时发现,加上nbf(生效时间)验证更保险,这就好比给门锁又加了道插销。

通过基础验证只是拿到入场券,真正的权限博弈才刚开始。我们的RBAC(基于角色的访问控制)系统会做三件事:

从Payload解析用户角色(比如admin/user)查询Redis缓存获取最新权限列表用AOP切面验证接口注解(如@PreAuthorize("hasRole('ADMIN')"))

有次市场部要临时查看运营数据,普通账号需要临时提权。我们创新性地在Payload加入temp_roles字段,配合定时任务自动回收权限,这操作比重庆火锅涮毛肚还要丝滑。

2019年做政务云项目时,某合作方直接把密钥硬编码在配置文件里。结果被黑产用strings命令轻松提取,造成百万级数据泄露。现在我们用Hashicorp Vault管理密钥,每季度自动轮换,比银行金库还严实。

还有个经典案例:某外包团队把JWT存在URL参数里,被流量监控抓个正着。后来我们全站强制开启HSTS,所有API走HTTPS,就像给数据穿上了防弹衣。

红色警告表示签名错误→赶紧检查密钥是否泄露Payload显示"admin":true但实际不是管理员→说明被中间人篡改exp显示三天前的日期→该考虑续签方案了

去年我用这套方法帮某券商排查漏洞,发现他们的Token居然没加密传输,吓得CTO当场拍桌子要求全部门整改。

这些经验可都是我们团队用真金白银换来的,去年某次攻防演练后,安全评分直接从72飙到95,甲方爸爸乐得直接续签三年合同。

来源:电脑技术汇

相关推荐