详解JWT与Token的应用与原理

目录
  • JWT的应用
  • Token的组成原理
  • JWT对称加密
  • JWT非对称加密
  • 生成私钥和公钥

前言: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应用与原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JSON Web Token(JWT)原理入门教程详解

    目录 一.跨域认证的问题 二.JWT 的原理 三.JWT 的数据结构 3.1 Header 3.2 Payload 3.3 Signature 3.4 Base64URL 四.JWT 的使用方式 五.JWT 的几个特点 六.参考链接 一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. 3.服务器向用户返回一个 session_id,写入用户的 Co

  • JWT 设置token过期时间无效的解决

    目录 JWT 设置token过期时间无效 原因 原因分析 JWT token过期自动续期解决方案 JWT token token过期刷新方案 JWT 设置token过期时间无效 原因 设置超时时间的顺序有误, 应调用setClaims()方法设置claims属性. 在调用setExpiration()方法设置超时时间. Date expiresDate = new Date(System.currentTimeMillis() + expire_time);// expire_time为toke

  • 一文了解什么是JWT

    目录 起源 session认证 token认证 什么是JWT JWT的数据结构 Header Payload Signature JWT的优点 怎么使用JWT 总结 起源 需要了解一门技术,首先从为什么产生开始说起是最好的.JWT 主要用于用户登录鉴权,所以我们从最传统的 session 认证开始说起. session认证 众所周知,http 协议本身是无状态的协议,那就意味着当有用户向系统使用账户名称和密码进行用户认证之后,下一次请求还要再一次用户认证才行.因为我们不能通过 http 协议知道

  • JWT登录认证实战模拟过程全纪录

    目录 Token 认证流程 Token 认证优点 JWT 结构 JWT 基本使用 实战:使用 JWT 登录认证 附:为什么使用jwt而不使用session 总结 Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Token) 深受开发者的喜爱,主要流程如下: 客户端发送账号和密码请求登录 服务端收到请求,验证账号密码是否通过 验证成功后,服务端会生成唯一的 token,并将其返回给客户端 客户端接受到 token,将其存储在 cookie 或者 localStro

  • 详解struts2的token机制和cookie来防止表单重复提交

    详解struts2的token机制和cookie来防止表单重复提交 今天在做一个投票系统时要实现防止表单重复提交! 当时就想到了用struts2提供的token机制 struts2的token机制防止表单重复提交: 首先需要在提交的jsp页面(要使用token机制,必须使用struts2提供的标签库)加上 <s:token></s:token> 这段代码,然后在struts.xml里面需要进行如下配置: <action name="token" class

  • 详解python的super()的作用和原理

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递. 今天我们介绍的主角是super(), 在类的继承里面super()非常常用, 它解决了子类调用父类方法的一些问题, 父类多次被调用时只执行一次, 优化了执行逻辑,下面我们就来详细看一下. 举一个例子: class Foo:   def bar(self, message):     print(message) >>> Foo(

  • 详解实现vue的数据响应式原理

    这篇文章主要是给不了解或者没接触过 vue 响应式源码的小伙伴们看的,其主要目的在于能对 vue 的响应式原理有个基本的认识和了解,如果在面试中被问到此类问题,能够知道面试官想让你回答的是什么?「PS:文中如有不对的地方,欢迎小伙伴们指正」 响应式的理解 响应式顾名思义就是数据变化,会引起视图的更新.这篇文章主要分析 vue2.0 中对象和数组响应式原理的实现,依赖收集和视图更新我们留在下一篇文章分析. 在 vue 中,我们所说的响应式数据,一般指的是数组类型和对象类型的数据.vue 内部通过

  • 详解MySQL中事务隔离级别的实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别. 今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的实现原理. 当然MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正. 说明 MySQL的事务实现逻辑是位于引擎层的,并且不是所有的引擎都支持事务的,下面的说明都是以InnoDB引擎为基准.

  • 详解MySQL中事务的持久性实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别. 在之前的文章我们已经了解了MySQL中事务的隔离性的实现原理,今天就继续来聊一聊MySQL持久性的实现原理. 当然MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正. 说明 MySQL的事务实现逻辑是位于引擎层的,并且不是所有的引擎都支持事务的,下面的说明都是以InnoDB

  • 详解Android JetPack之LiveData的工作原理

    前言 本篇文章主要讲解LiveData工作的原理,如果还不知道LiveData如何用的话,请参考官方文档. LiveData的讲解涉及到了Lifecycle的知识,如果你还不了解LifeCycle,请参考文档LifeCycle介绍. 介绍 LiveData是一个数据持有类,它可以通过添加观察者被其他组件观察其变更.不同于普通的观察者,它最重要的特性就是遵从应用程序的生命周期,如在Activity中如果数据更新了但Activity已经是destroy状态,LivaeData就不会通知Activit

  • 详解vue3.2新增的defineCustomElement底层原理

    目录 Web Components customElements 概述 HTMLTemplateElement 内容模板元素 概述 常用属性 ShadowRoot 概述 Web Components Web Components 是一套不同的技术,允许您创建可重用的定制元素(它们的功能封装在您的代码之外)并且在您的web应用中使用它们. 相当于是浏览器原生的定义组件的方式,不用通过vue或者react这些框架实现组件的定义 customElements 概述 customElements 是Wi

  • 详解eclipse项目中的.classpath文件原理

    目录 1 前言 2 作用 3 .classpath内容 3.1 kind="src" 3.2 kind="output" 3.3 kind="con" 3.3.1 JRE配置 3.3.2 Server Runtime配置 3.3.3 Web App Libraries配置 3.3.4 User Library配置 3.4 kind="lib" 3.5 顺序 1 前言 在使用eclipse或者myeclipse进行java项目开

  • 详解Python中迭代器和生成器的原理与使用

    目录 1.可迭代对象.迭代器 1.1概念简介 1.2可迭代对象 1.3迭代器 1.4区分可迭代对象和迭代器 1.5可迭代对象和迭代器的关系 1.6可迭代对象和迭代器的工作机制 1.7自己动手创建可迭代对象和迭代器 1.8迭代器的优势 1.9迭代器的缺点和误区 1.10python自带的迭代器工具itertools 2.生成器 2.1生成器的创建方法 2.2生成器方法 2.3生成器的优势 2.4生成器应用场景 3.生成器节省内存.迭代器不节省内存 3.1可迭代对象 3.2迭代器 3.3生成器 3.

  • 详解Java String中intern方法的原理与使用

    目录 简介 常量池简介 intern方法简介(JDK7) 原理(JDK6与JDK7) 例程测试 例程分析 jdk1.6 jdk1.7 应用实例 简介 本文介绍Java的String的intern方法的原理. 常量池简介 在 JAVA 语言中有8种基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池(在方法区)的概念.常量池就类似一个JAVA系统级别提供的缓存.8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊. Str

随机推荐