因为前一段时间做了一个系统持续操作期间自动刷新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. linux常用快捷键总结

    启动器:<super> 显示桌面:<super>D 文件管理器:<super>E 显示工作区:<super>S 打开终端:ctrl+alt+T 关闭窗口 ...

  2. 【面试题】GC Root都有哪些?

    那天去面试,面试官问我JVM垃圾回收,我是有备而来,上来就是一个可达性分析算法,然后就是一个复制算法,标记-清理,标记-整理,以及几个常见的垃圾回收器 详情见:https://www.cnblogs. ...

  3. 笔试题.NET基础代码面试题

    题目如下,本随笔只是记录,都是一些自身面经的题目,您既然点开了的话,学习下无妨,说不定有帮助呢 以下答案都经过博主一个个去运行过. 题目1 (实例化后 x=?;y=? 输出什么): public cl ...

  4. Jenkins Job间传递参数的一种方法

    场景: Jenkins 中可以建多个Job,一般是主编译Job,多个子Job. 子Job要用主Job中的版本号,编译号. 1)  在主Job里面添加脚本命令: echo set MainVersion ...

  5. I am zhoukangyang!

    我是 \(\texttt{zhoukangyang}\),一名来自浙江省,杭州市的初二菜鸡 \(\texttt{oier}\) . 洛谷zhoukangyang 很多东西因为太垃圾所以 了,要开 请洛 ...

  6. C++ 虚函数表与多态 —— 多重继承的虚函数表 & 内存布局

    多重继承的虚函数表会有两个虚表指针,分别指向两个虚函数表,如下代码中的 vptr_s_1.vptr_s_2,Son类继承自 Father 和 Mather 类,并且改写了 Father::func_1 ...

  7. CSS-backgroound和radial-giadient的常见用法

    前言 这里主要介绍下css中background和radial-giadient径向渐变的使用,工作中用到的地方可能也不太多,但是每次用到了都需要查阅官网,查资料就比较麻烦,这里记录一下我自己整理的常 ...

  8. Day5 - 06 函数的参数-命名关键字参数

    引子:对于关键字参数,调用时可以传入任意个不受限制的关键字参数,至于到底传入了哪些,就需要在函数内部通过[函数里定义的关键字参数]检查,例子里就是通过otherinfo检查.        >& ...

  9. jmeter__问题记录,中文乱码问题(json参数化)

    这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...

  10. 登录linux时 shell执行顺序

    # .bash_history,.bash_logout,.bash_profile,.bashrc/etc/profile 全局.bash_history 记录当前登录用户历史操作的命令.bash_ ...