简介
JWT (JSON Web Token) 是目前最流行的跨域认证解决方案。
做什么用的
用来做用户认证的,判断请求是否可信之类。
基础流程
- 用户登录验证通过后,后台签发一个 jwt。并返回给前端。
- 后续,用户与服务器的通信,都需要加上这个 jwt 数据(一般写在请求头中),后台代码依靠这个数据来做用户的认证。
Authorization: Bearer <token>
JWT 的组成
jwt 一般长成下面这个样子:
![12201495-c6a786a32e7ab869.png](https://upload-images.jianshu.io/upload_images/12201495-c6a786a32e7ab869.png)
长啥样
由三个部分组成,各个部分通过 "." 分割开:
- Header (头部)
- Payload (负载)
- Signature (签名)
Header
Header 主要描述 JWT 的元信息。
![12201495-c17dd7325fd5af2a.png](https://upload-images.jianshu.io/upload_images/12201495-c17dd7325fd5af2a.png)
Header
alg
属性表示签名的算法。默认是 HMAC SHA256 (写成 HS256)
typ
属性表示令牌的类型。jwt 令牌统一写成 jwt
Payload
Payload 里面就是存储的数据
![12201495-f45cd51e14d5b350.png](https://upload-images.jianshu.io/upload_images/12201495-f45cd51e14d5b350.png)
Payload
Signature
Signature 部分是对前两部分的签名,防止数据篡改。
![12201495-95606fdf9439d816.png](https://upload-images.jianshu.io/upload_images/12201495-95606fdf9439d816.png)
Signature
JWT 的特点
- JWT 默认是不加密的,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
- JWT 不加密的情况下,不能将秘密数据写入 JWT。
- JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
- JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
- JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
- 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
基于 NodeJS 的 jwt 创建与验证
1. 安装 jsonwebtoken
npm install jsonwebtoken --save
2. 创建与签发
// test.js
const jwt = require('jsonwebtoken');
const payload = {
name: 'zhangsan',
admin: true
}
const secret = 'MY_GOOD';
const token = jwt.sign(payload, secret);
console.log(token);
运行上面的 js 文件会得到的字符串就是创建出来的jwt
。返回给前端即可。
3. 验证与解码
// test.js
const jwt = require('jsonwebtoken');
const payload = {
name: 'zhangsan',
admin: true
}
const secret = 'MY_GOOD';
const token = jwt.sign(payload, secret);
console.log(token);
jwt.verify(token, secret, (error, data) => {
if (error) {
console.log(error.message);
return;
}
console.log(data);
})