休闲

jwt的token身份授权验证

时间:2010-12-5 17:23:32  作者:休闲   来源:娱乐  查看:  评论:0
内容摘要:登录成功后,服务器塞给你一个加密字符串,这就是JWT。你拿着它去访问受保护的资源,服务器验一下签名,认了,放行。整个过程无状态,服务器不用存session,这设计确实漂亮。 JWT全称JSON Web

登录成功后,份授服务器塞给你一个加密字符串,权验这就是份授JWT。你拿着它去访问受保护的权验资源,服务器验一下签名,份授认了,权验放行。份授整个过程无状态,权验服务器不用存session,份授这设计确实漂亮。权验

JWT全称JSON Web Token,份授结构上分三段:Header、权验Payload、份授Signature。权验Header告诉你用的份授是啥算法,比如HS256;Payload装用户ID、过期时间这些声明;Signature则是把前两段用密钥签名后的结果。三段用点号拼起来,像一串乱码,但里面藏着你的身份信息。

实际开发里,我见过不少团队把JWT当万能钥匙,啥都往Payload里塞。有人把用户手机号、邮箱、甚至权限列表全写进去,图的是后端不用查库。这思路有点危险——Payload虽然base64编码,但**没加密**,任何人拿到token解码就能看到明文。你不想让用户知道的东西,千万别放里面。真要藏敏感信息,得另做加密,或者干脆只放一个用户ID,剩下的靠后端查。

还有个坑是过期时间。有人把过期设成七天、三十天,甚至一年。方便是方便,但token一旦泄露,别人能顶着你的身份浪很久。折中做法是短token配refresh token,access token十五分钟过期,refresh token七天,刷新时换新的。代价是服务端得维护refresh token的状态,无状态优势打了折扣,但安全性和体验平衡得更好。

再聊聊签名算法。HS256是共享密钥,签发和验证都用同一个key,适合单一服务内部用。RS256是公钥签名、私钥签发,验证方只需要拿到公钥,适合第三方应用或微服务间验证。有人图省事用HS256,结果把密钥写死在前端代码里——这等于把保险柜钥匙贴在柜门上。密钥必须放服务端环境变量,或者专门的密钥管理服务,这是底线。

实际调JWT时,有个细节容易忽略:token被篡改怎么办?签名就是干这个的。你改了Payload里的用户ID,签名验证立刻失败。但有个例外——如果算法用的是`none`,那就没签名了。有些库默认接受`none`,攻击者把header里的alg改成none,再随便改payload,服务端可能就放行了。所以服务端必须白名单算法,只认你配置的那几种。

还有个体验问题。JWT是无状态的,意味着你没法主动让它失效。用户改了密码,旧token可能还能用几分钟甚至几小时。想踢人下线?做不到,除非你引入黑名单,把要注销的jti记下来。这又回到了有状态的老路。所以JWT最适合那些对实时性要求不高的场景,比如API网关鉴权、单点登录的临时凭证。

我自己的习惯是:JWT只做身份验证,不做权限控制。拿到token后,从里面取出用户ID,再查一次数据库拿最新权限。多一次查询,但保证权限变更能实时生效。代价是性能有点损耗,但换来的是逻辑清晰,不会出现“权限改了但token里还是旧的”这种诡异bug。

说到底,JWT是个工具,不是银弹。它解决的是分布式环境下无状态认证的问题,但也带来了泄露风险、失效延迟这些新麻烦。用之前想清楚你的业务场景:如果服务端能轻松存session,何必折腾JWT?如果一定要无状态,那就把过期时间设短,敏感信息别放Payload,密钥管严实。安全这东西,从来不是靠一个token就能搞定的。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap