详解JWT与Token的应用与原理

 更新时间:2023年04月18日 11:30:50   作者:coder_7  
这篇文章主要介绍了详解JWT与Token的应用与原理,JWT全称“JSON Web Token”,是实现Token的机制,需要的朋友可以参考下

前言:JWT全称“JSON Web Token”,是实现Token的机制。官网:https://jwt.io/

JWT的应用

  • JWT用于登录身份验证。
  • 用户登录成功后,后端通过JWT机制生成一个token,返回给客户端。
  • 客户端后续的每次请求都需要携带token,携带在authorization中。
  • 后端从authorization中拿到token后,通过secretKey进行解密验证身份。

Token的组成原理

JWT生成的Token由三部分组成:header payload signature

  • header
    • alg:指定signature采用的加密算法,默认是HS256,对称加密(加密和解密的密钥相同)
    • typ:固定值,通常是JWT
    • 通过base64Url算法进行编码
  • payload
    • 用户id和name
    • 默认携带iat,令牌签发时间(时间戳)
    • exp设置令牌过期时间
    • 通过base64Url算法进行编码
  • signature
    • 设置一个secretKey,通过将前两个结果合并后进行HS256算法
    • signature的组成:HS256(baseUrl64(header)+'.'+baseUrl(payload)+','+secretKey)
    • secreKey一定不能暴露,因为可以颁发token,也可以解密

采用HS256对称加密生成的Token(https://jwt.io/)

在这里插入图片描述

JWT对称加密

JWT默认使用的是HS256对称加密,其中secretKey是密钥,意味着公钥和私钥都是同一个,这样安全性不高。

例如在分布式服务中,其他系统服务器虽然可以用secretKey验证token,但是这样不安全,因为采用的是对称加密算法,每个服务器都可以通secretKey颁发token,黑客只要攻破任何一个服务器就可以拿到secretKey。

在这里插入图片描述

JWT非对称加密

所以我们需要使用非对称加密,加密和解密的密钥不一致。加密密钥称为“私钥”,解密密钥称为“公钥”。

在这里插入图片描述

采用RS256非对称加密生成的Token(https://jwt.io/)

在这里插入图片描述

生成私钥和公钥

mac电脑直接使用终端

windows电脑安装git,使用git bash终端。

  • 输入openssl
  • 输入genrsa -out private.key 2048生成私钥
  • 输入rsa -in private.key -pubout -out public.key生成公钥

代码中加密使用的算法需要修改为RS256非对称加密算法(注意:RS256最小密钥大小为2048位)

nodejs中实现JWT(token非对称加密)

const Koa = require('koa')
const KoaRouter = require('@koa/router')
const jwt = require('jsonwebtoken');
const fs = require('fs')

const app = new Koa();
const loginRouter = new KoaRouter({ prefix: '/login' })
const usersRouter = new KoaRouter({ prefix: '/users' })

const privateKey = fs.readFileSync('./keys/private.key')
const publicKey = fs.readFileSync('./keys/public.key')
// login接口
loginRouter.post('/', (ctx, next) => {
  const payload = { id: 1, name: 'zjc' }
  const token = jwt.sign(payload, privateKey, {
    expiresIn: 3000,
    algorithm: 'RS256'
  })
  ctx.body = {
    message: '登录成功',
    code: 200,
    token
  }
})
// users接口
usersRouter.get('/', (ctx, next) => {
  const token = ctx.header.authorization.replace('Bearer ', '')
  console.log(token);
  try {
    // 验证token
    jwt.verify(token, publicKey)
    ctx.body = {
      code: 200,
      data: ['xx', 'yy']
    }
  } catch (error) {
    ctx.body = {
      code: -1001,
      message: 'token无效'
    }
  }

})

app.use(loginRouter.routes())
app.use(usersRouter.routes())
app.listen(8000, () => {
  console.log('服务器启动成功');
})

到此这篇关于详解JWT与Token的应用与原理的文章就介绍到这了,更多相关JWT与Token应用与原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nodejs实现生成文件并在前端下载

    nodejs实现生成文件并在前端下载

    这篇文章主要介绍了nodejs实现生成文件并在前端下载,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • mac下安装node.js的详细步骤

    mac下安装node.js的详细步骤

    Node.js本质上是一个JavaScript运行时环境,它提供了在服务器端运行JavaScript代码的能力,这篇文章主要给大家介绍了关于mac下安装node.js的详细步骤,需要的朋友可以参考下
    2023-10-10
  • nodejs+axios爬取html出现中文乱码并解决示例

    nodejs+axios爬取html出现中文乱码并解决示例

    这篇文章主要为大家介绍了nodejs+axios爬取html出现中文乱码示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Node.js 使用 zlib 内置模块进行 gzip 压缩

    Node.js 使用 zlib 内置模块进行 gzip 压缩

    这篇文章主要介绍了Node.js 使用 zlib 内置模块进行 gzip 压缩,nodejs为我们提供了一个zlib内置模块,我们可以使用它其中的gzip方法来对传递的数据进行压缩,从而提高数据传递效率,更多相关内容需要的朋友可以参考一下
    2022-09-09
  • node.js基于express使用websocket的方法

    node.js基于express使用websocket的方法

    这篇文章主要介绍了node.js基于express使用websocket的方法,结合实例形式分析了node.js基于express调用websocket相关设置与使用操作技巧,需要的朋友可以参考下
    2017-11-11
  • node.js通过Sequelize 连接MySQL的方法

    node.js通过Sequelize 连接MySQL的方法

    这篇文章主要介绍了node.js通过Sequelize 连接MySQL的方法,本文给大家介绍的非常详细,对大家的学习或工作,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Nodejs express框架一个工程中同时使用ejs模版和jade模版

    Nodejs express框架一个工程中同时使用ejs模版和jade模版

    这篇文章主要介绍了Nodejs express框架一个工程中同时使用ejs模版和jade模版 的相关资料,需要的朋友可以参考下
    2015-12-12
  • Node.JS利用PhantomJs抓取网页入门教程

    Node.JS利用PhantomJs抓取网页入门教程

    现今,网页抓取已经是一种人所共知的技术了,然而依然存在着诸多复杂性,下面这篇文章主要给大家介绍了Node.JS利用PhantomJs抓取网页的方法教程,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • 在Ubuntu系统上安装Ghost博客平台的教程

    在Ubuntu系统上安装Ghost博客平台的教程

    这篇文章主要介绍了在Ubuntu系统上安装Ghost博客平台的教程,Ghost博客平台以Node.js写成,需要的朋友可以参考下
    2015-06-06
  • node-webkit打包成exe文件被360误报木马的解决方法

    node-webkit打包成exe文件被360误报木马的解决方法

    这篇文章主要介绍了node-webkit打包成exe文件被360误报木马的解决方法的相关资料,需要的朋友可以参考下
    2015-03-03

最新评论