文章目录
一、为什么你的登录系统需要JWT?
在座各位码农应该都经历过这样的痛苦:用户登录状态维护起来简直比追对象还难!传统的Cookie-Session方案在分布式系统中就像用竹篮打水——根本存不住!(别问我怎么知道的,说多了都是泪😭)
这时候就该我们的主角**JWT(JSON Web Token)**登场了!它就像是程序员界的瑞士军刀,能解决:
- 分布式系统的认证难题
- 服务端无状态化需求
- 跨域资源共享(CORS)
- 移动端/前后端分离适配
二、JWT解剖课:原来你是这样的Token!
一个完整的JToken长这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
拆开来看其实是三部分(划重点!!!):
2.1 Header(头信息)
{
"alg": "HS256", // 签名算法
"typ": "JWT" // token类型
}
2.2 Payload(载荷)
{
"sub": "1234567890", // 用户ID(核心!!)
"name": "John Doe",
"iat": 1516239022 // 签发时间
}
2.3 Signature(签名)
通过前两部分+密钥生成的防伪标识,就像古代皇帝的玉玺盖戳!
三、实战!从0到1实现JWT登录
以Node.js为例(其他语言原理相通):
3.1 安装核心依赖
npm install jsonwebtoken cookie-parser
3.2 生成Token(登录接口)
const jwt = require('jsonwebtoken');
router.post('/login', (req, res) => {
// 1.验证用户名密码(省略)
// 2.生成Token
const token = jwt.sign(
{ userId: user.id },
'你的超级密钥',
{ expiresIn: '2h' } // 2小时过期
);
// 3.返回给客户端
res.cookie('token', token, { httpOnly: true });
res.json({ success: true });
});
3.3 验证中间件
function authMiddleware(req, res, next) {
const token = req.cookies.token;
try {
const decoded = jwt.verify(token, '你的超级密钥');
req.user = decoded.userId;
next();
} catch (err) {
res.status(401).json({ error: '无效的Token!' });
}
}
3.4 过期处理技巧
在Payload中加入过期时间:
{
"exp": Math.floor(Date.now() / 1000) + (60 * 60) // 1小时后过期
}
四、安全防护指南(必看!!)
- HTTPS必须上:裸奔的JWT等于把密码写在脸上!
- 密钥要够复杂:至少32位随机字符串(别用admin123这种祖传密码!)
- 定期刷新Token:建议采用长短Token机制
- 敏感操作二次验证:比如修改密码时要求短信验证
- 黑名单机制:虽然JWT本身无状态,但注销时可以把未过期的Token加入黑名单
五、常见翻车现场
Q1:Token被盗怎么办?
A:就像银行卡丢了要挂失,建议:
- 结合IP检测
- 设置短期有效期
- 关键操作二次认证
Q2:Payload能存密码吗?
A:绝对不行!!(重要的事情说三遍)Payload虽然经过Base64编码,但相当于明文传输!
Q3:分布式系统怎么存储用户状态?
A:推荐把基础信息放在JWT中,详细数据通过userID查缓存(Redis真香!)
六、总结与踩坑心得
经过实战验证,JWT确实能让登录验证变得优雅。但要注意:
- 控制Payload体积(太大影响性能)
- 密钥管理要严格(建议用环境变量)
- 过期时间别设太长(建议2小时以内)
最后说句大实话:技术没有银弹,JWT虽好但也要看场景。如果是银行级系统,还是建议上OAuth2.0等更复杂的方案。
(本文示例代码已在我的个人博客[rmsys.top]同步更新,欢迎来踩~)
特殊字符&spm=1001.2101.3001.5002&articleId=148043019&d=1&t=3&u=c35aaea827af4c3da7d6c28d771d78e9)
6218

被折叠的 条评论
为什么被折叠?



