JWT (Json Web Token)教程
JWT(Json Web Token)是实现token技术的一种解决方案,JWT由三部分组成:
header(头)
、payload(载体)
、signature(签名)
。
头
JWT第一部分是header,header主要包含两个部分,alg指加密类型,可选值为HS256
、RSA
等等,typ=JWT
为固定值,表示token的类型。。
{"typ": "JWT","alg": "HS256"
}
载体
JWT第二部分是payload,payload是token的详细内容,一般包括iss
(发行者), exp
(过期时间), sub
(用户信息), aud
(接收者),以及其他信息,详细介绍请参考官网,也可以包含自定义字段。
{"iat": 1493090001,"name": "张三"
}
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
签名
JWT第二部分是signature,这部分的内容是这样计算得来的:
Base64(header)
.Base64(payload)
得到一个Base64编码的字符串(下文成EncodeString)
HS256(EncodeString,"秘钥");计算得到的即使签名。
计算得到上面三部分内容后,用.连接起来就是一个完整的 JWT TOKEN,秘钥是保存在服务器上的一个私有密钥。
将头部、声明、签名用.号连在一起就得到了我们要的JWT。
eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTUyOTgxNDEsImtleSI6InZhdWxlIn0.orewTmil7YmIXKILHwFnw3Bq1Ox4maXEzp0NC5LRaFQ
和Session方式存储id的差异
Session方式存储用户id的最大弊病在于要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。
而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如用户角色,用户性别等。
java 使用 jwt
引入jar
<!--JWT-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version>
</dependency>
demo
package user;import io.jsonwebtoken.*;
import org.joda.time.DateTime;
import org.junit.Test;import java.util.Date;public class JWT {private static final String PRIVATE_KEY = "123456789";@Testpublic void jwtTest() throws InterruptedException {// 设置3秒后过期String jwt = this.buildJwt(DateTime.now().plusSeconds(3).toDate());System.out.println(jwt);// 验证token是否可用boolean isOk = this.isJwtValid(jwt);System.out.println(isOk);}public String buildJwt(Date exp) {String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, PRIVATE_KEY)//SECRET_KEY是加密算法对应的密钥,这里使用额是HS256加密算法.setExpiration(exp)//expTime是过期时间.claim("key", "vaule")//该方法是在JWT中加入值为vaule的key字段.compact();return jwt;}public boolean isJwtValid(String jwt) {try {//解析JWT字符串中的数据,并进行最基础的验证Claims claims = Jwts.parser().setSigningKey(PRIVATE_KEY)//SECRET_KEY是加密算法对应的密钥,jjwt可以自动判断机密算法.parseClaimsJws(jwt)//jwt是JWT字符串.getBody();String vaule = claims.get("key", String.class);//获取自定义字段key//判断自定义字段是否正确if ("vaule".equals(vaule)) {return true;} else {return false;}}//在解析JWT字符串时,如果密钥不正确,将会解析失败,抛出SignatureException异常,说明该JWT字符串是伪造的//在解析JWT字符串时,如果‘过期时间字段’已经早于当前时间,将会抛出ExpiredJwtException异常,说明本次请求已经失效catch (SignatureException | ExpiredJwtException e) {return false;}}
}
JWT (Json Web Token)教程相关推荐
- JWT(JSON Web Token)简介及实现
JWT(JSON Web Token):是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为Json对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信 ...
- JWT(JSON web token)
1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contain ...
- 关于JWT(Json Web Token)的思考及使用心得
什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...
- jwt token 过期刷新_如何在SpringBoot中集成JWT(JSON Web Token)鉴权
这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...
- 关于JWT(Json Web Token)的思考及使用心得 1
什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(https://tools.ietf.org/html/r...,一般用来做轻量级的API鉴权.由于许 ...
- sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证
一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...
- 什么是 JWT -- JSON WEB TOKEN
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...
- 登录令牌JWT — JSON WEB TOKEN
登录令牌JWT - JSON WEB TOKEN 关于作者 作者介绍
- 在吗?认识一下JWT(JSON Web Token) ?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:是虎子呀 地址:my.oschina.net/u/4062 ...
最新文章
- python opencv 视频剪辑
- 大学python实训总结-【实训总结】大学生python相关实训总结
- 《化工原理》课程设计说明书
- msf如何升级_Kali linux 2016.2(Rolling)中的Metasploit如何更新与目录结构初步认识...
- oracle序列修改语句
- selenium+python设置爬虫代理IP的方法
- TempData[a]多个Action方法之前共享数据
- 用深度优先搜索解决最长路径问题
- 计算机控制系统中的Z变换
- CGAL点云重建白膜
- python实现syn半扫描_python 实现 syn 扫描
- 汽车维修企业管理【15】
- 雨点效果——HTML5之特效
- mysql gone away的几种原因
- linux 内核通知,[Linux] 内核通知链 notifier
- Electron打包方式
- Python学习记录(4)元组:戴了紧箍咒的列表
- 考公历程 #1 学习笔记
- 基于matlab的相干信号的doa 估计,基于空间平滑MUSIC算法的相干信号DOA估计(1)
- mysql查询2开头的_MySQL-2.查询