因为前一段时间做了一个系统持续操作期间自动刷新token有效性的需求,然后就想着找一个空闲时间总结一下JWT,所以今天就简单的记录一下自己了解的内容。


JWT是什么

  1. JWT全称是JSON Web Token,是一个开放标准,它定义了一种紧凑的、自包含的结构,可用于在服务之间信息传递和授权认证。
  • 信息传递:通过签名,可以确保传递的信息不被篡改且不是伪造的。
  • 授权认证:通过JWT生成的token信息进行验签,确保是自己服务签发的token信息。
  1. JWT的格式:

JWT由三部分组成,各部分之间使用[.]进行连接。各部分分别是:Header(头信息)、Payload(载荷)和Signature(签名)。

其格式如下:

header.payload.signature
  1. 使用场景

前端页面点击登录,后端验证用户名密码通过后,使用JWT生成token信息返回给前端,前端使用登录token请求各个接口。


JWT使用示例

首先引入JWT jar包如下:

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>

Java示例代码如下:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import java.util.*; public class JWTDemo { public static void main(String[] args) {
String issue = "ISSUE_CESHI";
// 签名算法
SignatureAlgorithm algorithm = SignatureAlgorithm.HS256;
// 签名秘钥
String secret = "CESHI_SECRET";
int timeout = 60 * 60 * 6; long currentTime = System.currentTimeMillis();
Map<String,Object> map = new HashMap<>();
map.put("userId","10");
map.put("userName","张三"); String token = Jwts.builder()
.signWith(algorithm, secret)
.setClaims(map)
.setId(UUID.randomUUID().toString())
.setIssuedAt(new Date(currentTime))
.setIssuer(issue)
.setExpiration(new Date(currentTime + timeout * 1000))
.compact();
System.out.println(token); Jws<Claims> parseResult3 = Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
}
}

上面演示代码生成的token信息如下:

eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJJU1NVRV9DRVNISSIsInVzZXJOYW1lIjoi5byg5LiJIiwiZXhwIjoxNjEwMzgzMzY0LCJ1c2VySWQiOiIxMCIsImlhdCI6MTYxMDM2MTc2NCwianRpIjoiY2QwNDM1ODctNGZmNS00OGY4LTk2YjUtNTA1ZTc4MzFkMGNjIn0.b_Fr8hpTC5nlwR4NikbEg1WpDMya2Gr5fCfNTV0iCOQ

然后将生成的token进行解析得到如下内容:

可以看到载荷里面有我们设置的userId和userName信息。

同时,JWT规定了7个官方的字段,如下:

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

需要特别注意的是,JWT的header和body部分都是用Base64进行编码的,本身不具有加密属性,所以在body中不能存储敏感信息。


系统持续操作自动刷新token

JWT的一大优点就是token信息存储在客户端,服务端不用存储对应的授权信息。因此,它的一大缺点就是一旦token颁发了就没办法进行撤销,只有等待token自动失效。

如果想要实现token失效前撤销,那么只能借助其他手段,比如使用redis缓存,token验证除了JWT本身的验签外,还需要判断redis缓存信息,但是这样做有违JWT的设计本意。

说说在项目中遇到的需求:就是在用户持续间隔时间内操作系统,那么系统内部应该自动刷新token信息,而不是在固定时间点强行要求重新登录。比如token颁发的有效期是5个小时,然后用户一直操作到4小时59分59秒,然后在5小时0分1秒的时候提交一个表格,这时如果因为token失效直接跳转到登录页面,这样的用户体验感是极为糟糕的。

所以为了解决上面的场景,在写这个需求的时候,特地调研了一下各种方案,最后综合了一下,决定采用redis实现。方案如下:

颁发一个足够时长的token(比如15天),然后存储在redis中,redis中设置短的有效期,比如6小时。从而实现在6小时内有效操作免登录。

JWT初识记录的更多相关文章

  1. .net core jwt 入门记录

    从百度里搜索里搜索了很多jwt的文章,跟着文章写了一个demo,这里记录下学习过程中碰上的问题.看文章多遍,不如手工实现一次. 模板已上传到github.com:dogvane/webapi_jwt_ ...

  2. django项目中账号注册登陆使用JWT的记录

    需求分析 1.  注册用JWT做状态保持    1.1 安装jwt    pip install djangorestframework-jwt        1.2 去settings里面配置jwt ...

  3. PHP JWT初识

    一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt.才发现jwt已经被大家广泛的应用了.看来我有点out了.哈哈,趁着这个世界来好好看看这个. JWT(JSON Web Token ...

  4. JWT 拓展

    JWT适用场景 https://www.jianshu.com/p/af8360b83a9f 适用于一次性操作的认证,颁布一个很短过期时间的JWT给浏览器. 无状态的JWT无法实现精确的在线人数统计. ...

  5. Mysql之一二

    1.limit用来限制select语句返回指定的记录数,可以接受一个或者两个数字参数.如果参数为一个,是返回的数据条数:如果给定参数为两个,第一个参数为指定第一个返回记录行的偏移量(初识记录行的偏移量 ...

  6. 四、redis数据类型

    四.redis数据类型 redis可以理解成一个全局的大字典,key就是数据的唯一标识符.根据key对应的值不同,可以划分成5个基本数据类型. 1. string类型: 字符串类型,是 Redis 中 ...

  7. 初识SSO与JWT

    以前在学校做项目的时候,登录注销,权限验证这些事情,都是交给框架来做的,每次都是把这个架子拿到项目中去,也没有真正思考过它的过程,总觉的这些都是十分简单的逻辑. 然而来公司工作之后,慢慢觉得登录和权限 ...

  8. Java NIO学习与记录(一):初识NIO

    初识 工作中有些地方用到了netty,netty是一个NIO框架,对于NIO却不是那么熟悉,这个系列的文章是我在学习NIO时的一个记录,也期待自己可以更好的掌握NIO. 一.NIO是什么? 非阻塞式I ...

  9. Spring 学习记录8 初识XmlWebApplicationContext(2)

    主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...

随机推荐

  1. Robot framework 环境搭建+图标处理

    场景:随着现在项目各种赶工,很多时候界面上的功能还没有实现,这时就可以先对接口进行验证,提早发现一些和预期不一致的错误. Robot framework需要的几个知识点: 测试库:RF是大树,测试库就 ...

  2. this.$options.data()实战之重置data

    刚刚看到这个方法学习了一下,然后想到正在开发的项目有一个需要重置data的操作,正好拿来使用一下,节省了好多代码,美滋滋...

  3. Panda Global获悉,美国承诺4年内明确区块链数字资产监管方式!

    近日,美国商品期货交易委员会(CFTC)宣布,在4年内将会全面把加密货币监管列为优先事项.Panda Global从7月8日公布的新战略中获悉,此次CFTC公布了自己接下来的新框架,并且在框架中承诺: ...

  4. DarkMode(1):产品应用深色模式分析

    为什么Dark Mode变得越来越流行 2018 年的 macOS Mojave 率先支持了深色外观,紧接着 Windows 10 在 2018 年的 10 月份大版本更新中,也引入了 Dark Mo ...

  5. JavaSE24-类加载器&反射&模块化

    1.类加载器 1.1 类加载 类加载的描述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化.如果不出现意外情况,JVM将会连续完 ...

  6. 2. 使用Shell能做什么

    批处理 在批处理的过程中,能够实现脚步自动化,比GUI自动化速度高效 日常工作场景 服务端测试 移动端测试 持续集成与自动化部署,这是最最场景的场景,可以说离开了shell,持续集成和自动化部署也会遇 ...

  7. 关于golang的time包总结

    目录 前言 time包详解 总结 前言 各种编程语言都少不了与时间有关的操作,因为很多判断都是基于时间,因此正确和方便的使用时间库就很重要额. golang提供了import "time&q ...

  8. react第X单元(redux)

    第X单元(redux) #课程目标 理解redux解决的问题,理解redux的工作原理 熟练掌握redux的api 熟练掌握redux和react组件之间的通信(react-redux) 把redux ...

  9. mini-web框架-装饰器-总结1(5.3.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 原则:开放封闭 可以扩展,但是不可以修改.也就是说软件对扩展开放,对修改关闭. 运用技术:闭包 一共两种方法,一个使用闭包,一个使用类 使用多个装饰器 ...

  10. Linux下通用二进制方式安装MySQL

    1.下载glibc版本的MySQL: https://downloads.mysql.com/archives/community/ 2.查看mysql用户和mysql组是否存在(用户和组的信息存在/ ...