JWT初识记录
因为前一段时间做了一个系统持续操作期间自动刷新token有效性的需求,然后就想着找一个空闲时间总结一下JWT,所以今天就简单的记录一下自己了解的内容。
JWT是什么
- JWT全称是JSON Web Token,是一个开放标准,它定义了一种紧凑的、自包含的结构,可用于在服务之间信息传递和授权认证。
- 信息传递:通过签名,可以确保传递的信息不被篡改且不是伪造的。
- 授权认证:通过JWT生成的token信息进行验签,确保是自己服务签发的token信息。
- JWT的格式:
JWT由三部分组成,各部分之间使用[.]进行连接。各部分分别是:Header(头信息)、Payload(载荷)和Signature(签名)。
其格式如下:
header.payload.signature
- 使用场景
前端页面点击登录,后端验证用户名密码通过后,使用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初识记录的更多相关文章
- .net core jwt 入门记录
从百度里搜索里搜索了很多jwt的文章,跟着文章写了一个demo,这里记录下学习过程中碰上的问题.看文章多遍,不如手工实现一次. 模板已上传到github.com:dogvane/webapi_jwt_ ...
- django项目中账号注册登陆使用JWT的记录
需求分析 1. 注册用JWT做状态保持 1.1 安装jwt pip install djangorestframework-jwt 1.2 去settings里面配置jwt ...
- PHP JWT初识
一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt.才发现jwt已经被大家广泛的应用了.看来我有点out了.哈哈,趁着这个世界来好好看看这个. JWT(JSON Web Token ...
- JWT 拓展
JWT适用场景 https://www.jianshu.com/p/af8360b83a9f 适用于一次性操作的认证,颁布一个很短过期时间的JWT给浏览器. 无状态的JWT无法实现精确的在线人数统计. ...
- Mysql之一二
1.limit用来限制select语句返回指定的记录数,可以接受一个或者两个数字参数.如果参数为一个,是返回的数据条数:如果给定参数为两个,第一个参数为指定第一个返回记录行的偏移量(初识记录行的偏移量 ...
- 四、redis数据类型
四.redis数据类型 redis可以理解成一个全局的大字典,key就是数据的唯一标识符.根据key对应的值不同,可以划分成5个基本数据类型. 1. string类型: 字符串类型,是 Redis 中 ...
- 初识SSO与JWT
以前在学校做项目的时候,登录注销,权限验证这些事情,都是交给框架来做的,每次都是把这个架子拿到项目中去,也没有真正思考过它的过程,总觉的这些都是十分简单的逻辑. 然而来公司工作之后,慢慢觉得登录和权限 ...
- Java NIO学习与记录(一):初识NIO
初识 工作中有些地方用到了netty,netty是一个NIO框架,对于NIO却不是那么熟悉,这个系列的文章是我在学习NIO时的一个记录,也期待自己可以更好的掌握NIO. 一.NIO是什么? 非阻塞式I ...
- Spring 学习记录8 初识XmlWebApplicationContext(2)
主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...
随机推荐
- 搭建xss-platform平台
一直想搭在公网搭建自己的XSS平台用来验证XSS漏洞,使用别人的平台自己心里总会有担心被摘果子的顾虑,前几天参考了不少前人的博客,终于搭建好了,搭建的途中也遇到了不少坑,故把搭建的经验分享出来,大佬轻 ...
- 静湖ABC段扫描器(长更)
想学习python图形化的知识,从C段扫描器开始入手,很多的扫描器只能扫描C段,对于A,B段却没有设置这个功能,所以想将扫描A段和B段的功能跟C段一起做了. 暂时的想法是,先完成C段扫描器,扫描的同时 ...
- (转)oracle体系结构
对于一门技术的学习,尤其是像Oracle database这种知识体系极其庞杂的技术来讲,从宏观上了解其体系结构是至关重要的.同时,个人认为,未必是专业DBA人员才需要了解其体系结构(固然对于数据库专 ...
- jQuery笔记(三)
day03 - jQuery 学习目标: 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery ...
- 个人项目作业——wc.exe
一.Github项目地址 https://github.com/PIPIYing/wc 二.项目概况 项目描述 Word Count 1. 实现一个简单而完整的软件工具(源程序特征统计程序). 2. ...
- 推荐系统实践 0x0e LS-PLM
在之前介绍的几个模型中,存在这些问题: LR不能捕捉非线性,只能进行一次的回归预测 GBDT+LR虽然能够产生非线性特征组合,但是树模型不适用于超高维稀疏数据 FM利用二阶信息来产生变量之间的相关性, ...
- 【题解】CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178]
[题解]CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178] 传送门: \(\text{CIRU - The area ...
- 五、Zookeeper基于API操作Node节点
安装zookeeper :linux下安装Zookeeper 3.4.14 zookeeper 分为5个包: org.apache.zookeeper //客户端主要类文件 org.apache.zo ...
- 微信小程序-卡券开发(前端)
刚完成一个微信小程序卡券开发的项目.下面记录开发前,自己困惑的几个问题. 因为我只负责了前端.所以下面主要是前端的工作. 项目概述:按照设计图开发好首页上的优惠券列表,点击某个优惠券,输入手机号,点击 ...
- JAVA基础学习1
一.JAVA是一种具有多种功能的高级语言:1,可以用于开发web页面上的小程序,桌面上运行的应用程序: 2,用于客户端服务器资源通讯的服务器端中间件: 3,还可以用于web服务器. 二.程序设计的5个 ...