16 - JWT

参考阮一峰大神文档

简介

JWT (JSON Web Token) 是目前最流行的跨域认证解决方案。

做什么用的

用来做用户认证的,判断请求是否可信之类。

基础流程

  1. 用户登录验证通过后,后台签发一个 jwt。并返回给前端。
  2. 后续,用户与服务器的通信,都需要加上这个 jwt 数据(一般写在请求头中),后台代码依靠这个数据来做用户的认证。
Authorization: Bearer <token>

JWT 的组成

jwt 一般长成下面这个样子:

12201495-c6a786a32e7ab869.png
长啥样

由三个部分组成,各个部分通过 "." 分割开:

  1. Header (头部)
  2. Payload (负载)
  3. Signature (签名)

Header

Header 主要描述 JWT 的元信息。

12201495-c17dd7325fd5af2a.png
Header

alg属性表示签名的算法。默认是 HMAC SHA256 (写成 HS256)
typ属性表示令牌的类型。jwt 令牌统一写成 jwt

Payload

Payload 里面就是存储的数据

12201495-f45cd51e14d5b350.png
Payload

Signature

Signature 部分是对前两部分的签名,防止数据篡改。

12201495-95606fdf9439d816.png
Signature

JWT 的特点

  1. JWT 默认是不加密的,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
  2. JWT 不加密的情况下,不能将秘密数据写入 JWT。
  3. JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
  4. JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
  5. JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
  6. 为了减少盗用,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);
})

猜你喜欢

转载自blog.csdn.net/weixin_34072637/article/details/86846418
jwt
16