本文的示例代码参考JWTBasic
目录
什么是JWT
JSON Web Token (JWT)
-
is an open standard (RFC 7519)
-
that defines a compact and self-contained way
-
for securely transmitting information between parties
-
as a JSON object
JWT的结构
JWT = Payload + Header + Signature
Payload
Payload = base64_encode(JSON Content)
vim payload.js
var content = {
"sub": "3252",
"name": "Test",
"iat": 1528516800,
"exp": 1528603200
};
var buffer = new Buffer(JSON.stringify(content));
var payload = buffer.toString('base64');
console.log(payload);
node payload.js
eyJzdWIiOiIzMjUyIiwibmFtZSI6IlRlc3QiLCJpYXQiOjE1Mjg1MTY4MDAsImV4cCI6MTUyODYwMzIwMH0=
Header
Header = base64_encode(JSON Content)
vim header.js
var content = {
"typ": "JWT",
"alg": "HS256"
};
var buffer = new Buffer(JSON.stringify(content));
var header = buffer.toString('base64');
console.log(header);
node header.js
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Signature
vim signature.js
var payload = new Buffer(JSON.stringify({
"sub": "3252",
"name": "Test",
"iat": 1528516800,
"exp": 1528603200
})).toString('base64');
var header = new Buffer(JSON.stringify({
"typ": "JWT",
"alg": "HS256"
})).toString('base64');
var algo = require('jwa')("HS256");
var secret = 'mystar';
var signature = algo.sign(header + '.' + payload, secret);
console.log(signature);
var jwt = header + '.' + payload + '.' + signature;
console.log(jwt);
cnpm i --save jwa
node signature.js
-C46PmPVQZt8hCEy0RQ8bmB0jzwXOx4FHw7Yqx8WA7w
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIzMjUyIiwibmFtZSI6IlRlc3QiLCJpYXQiOjE1Mjg1MTY4MDAsImV4cCI6MTUyODYwMzIwMH0=.-C46PmPVQZt8hCEy0RQ8bmB0jzwXOx4FHw7Yqx8WA7w
HS256 = HMAC (哈希安全消息验证码) + SH256 (安全哈希算法) 更多参考 web安全 之 存储密码 & PHP开发 之 摘要和签名
JWT与Session
JWT安全基于服务器签名+HTTPS
-
JWT信息经过base64编码很容易解码 所以信息不会加密 只能通过签名防篡改
-
JWT信息并不会加密 所以必须使用HTTPS来加密通信过程 否则信息会完全泄露
JWT存储在客户端而Session存储在服务器
-
JWT存储在客户端 可以缓解服务器Session存储压力
-
JWT存储在客户端 便于水平扩展实现单点登录(SSO)等 但是 Session可以通过Redis等共享解决类似问题
-
JWT存储在客户端 且包含有效期 所以服务器难于控制数据过期
JWT的应用场景
JWT可以防止CSRF攻击
关于CSRF攻击 更多参考 Web安全 之 CSRF攻击 & Laravel框架 之 CSRF
JWT可以应用于签名场景
生成重置密码url
审批人身份验证
JWT可以应用于简单鉴权
关于JWT鉴权 更多参考 JWT vs OAuth authentication & OAuth 2和JWT - 如何设计安全的API?
网友评论