为什么使用JWT?

随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。

1.JWT概念和作用

JWT全称为Json Web Token,说白了是什么呢? 就仅仅只是一个字符串而已,例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZX0.OLvs36KmqB9cmsUrMpUutfhV52_iSz4bQMYJjkI_TLQ

  该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景

2.JWT组成

JWT包含了三个主要部分: Header.Payload.Signature,以" . "来进行分割,以上式举例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZX0.

OLvs36KmqB9cmsUrMpUutfhV52_iSz4bQMYJjkI_TLQ

2.1 Header的作用

Header部分主要存储关于签名算法的信息,通常包含两个部分:token类型和采用的加密算法,大致源内容如下:{"typ":"JWT","alg":"HS256"} ,其中typ代表token类型,alg代表加密算法,然后使用Base64Url编码组成了Header部分,结果大致如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

2.2 Payload的作用

Payload是一个数据实体,俗称Claim,JWT并不强制使用,它默认这一部分数据为业务数据,是系统业务需要的数据,可有可无,可多可少。一般在不特殊修改的情况下,主要包含几个部分: iss(签发者),exp(过期时间戳), sub(面向的用户), aud(接收方), iat(签发时间),大致的源样式是这样:{ "sub": "1234567890", "name": "John Doe", "admin": true},经过Base64Url 编码以后,会变成JWT的第二部分字符串:

eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZX0

2.3 Signature的作用

创建签名需要使用编码后的header和payload以及一个秘钥,组成的公式:编码后的header、编码后的payload、一个secret进行加密HmacSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret),最终生成第三部分字符串:

OLvs36KmqB9cmsUrMpUutfhV52_iSz4bQMYJjkI_TLQ

3.JWT的主要作用

JWT最开始的初衷是为了实现授权和身份认证作用的,可以实现无状态、分布式的Web应用授权,大致实现的流程如下:

图中内容可见,JWT的使用流程大致有几步:
      1、客户端需要携带用户名/密码等可证明身份的内容去授权服务器获取JWT信息;
      2、每次服务都携带该Token内容与Web服务器进行交互,由业务服务器来来验证Token是否是授权系统发放的有效Token,来验证当前业务是否请求是否合法。
      需要注意:如果不是对于安全性要求非常高的情况,不建议每次请求都申请,因为会增加业务耗时,大部分时候建议在登陆时申请,然后使用JWT的过期时间或其他手段来保障JWT的有效性

引申:可以抵御跨站请求伪造攻击和签名验签的流程

4.常见问题
     

 JWT在SpringBoot中的简单应用

1.需要在Maven里面引入jwt依赖,jwt版本为0.9.0或者0.9.1都可以。

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

2.JWT的工具类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;/*** JWT工具类* * jwt的claim里一般包含以下几种数据:*   1. iss -- token的发行者*   2. sub -- 该JWT所面向的用户*   3. aud -- 接收该JWT的一方*   4. exp -- token的失效时间*   5. nbf -- 在此时间段之前,不会被处理*   6. iat -- jwt发布时间*   7. jti -- jwt唯一标识,防止重复使用      */
public class JwtTokenUtil {//有效时间 7天 单位:秒private int expiration=604800;//jwt秘钥private String secret="mySecret";//md5加密混淆keyprivate String md5_key="randomKey"; /*** 获取用户名从token中*/public String getUsernameFromToken(String token) {return getClaimFromToken(token).getSubject();}/*** 获取jwt发布时间*/public Date getIssuedAtDateFromToken(String token) {return getClaimFromToken(token).getIssuedAt();}/*** 获取jwt失效时间*/public Date getExpirationDateFromToken(String token) {return getClaimFromToken(token).getExpiration();}/*** 获取jwt接收者*/public String getAudienceFromToken(String token) {return getClaimFromToken(token).getAudience();}/*** 获取私有的jwt claim*/public String getPrivateClaimFromToken(String token, String key) {return getClaimFromToken(token).get(key).toString();}/*** 获取md5 key从token中*/public String getMd5KeyFromToken(String token) {return getPrivateClaimFromToken(token, md5_key);}/*** 获取jwt的payload部分*/public Claims getClaimFromToken(String token) {return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}/*** 解析token是否正确,不正确会报异常<br>*/public void parseToken(String token) throws JwtException {Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}/*** <pre>*  验证token是否失效*  true:过期   false:没过期* </pre>*/public Boolean isTokenExpired(String token) {try {final Date expiration = getExpirationDateFromToken(token);return expiration.before(new Date());} catch (ExpiredJwtException expiredJwtException) {return true;}}/*** 生成token(通过用户名和签名时候用的随机数)*/public String generateToken(String userName, String randomKey) {Map<String, Object> claims = new HashMap<>();claims.put(md5_key, randomKey);return doGenerateToken(claims, userName);}/*** 生成token*/private String doGenerateToken(Map<String, Object> claims, String subject) {final Date createdDate = new Date();final Date expirationDate = new Date(createdDate.getTime() + expiration * 1000);return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(createdDate).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS512, secret).compact();}/*** 获取混淆MD5签名用的随机字符串*/public String getRandomKey() {return getRandomString(6);}/*** 获取随机位数的字符串*/public static String getRandomString(int length) {String base = "abcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < length; i++) {int number = random.nextInt(base.length());sb.append(base.charAt(number));}return sb.toString();}
}

JWT实现Token认证相关推荐

  1. 基于JWT的Token认证机制实现

    一.基于JWT的Token认证机制实现 1.什么是JWT JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 2.JWT组成 ...

  2. jwt重放攻击_【干货分享】基于JWT的Token认证机制及安全问题

    一步一步教你基于JWT的Token认证机制实现,以及如何防范XSS攻击.Replay攻击和中间人攻击. 文章目录 一.几种常用的认证机制 1.1 HTTP Basic Auth HTTP Basic ...

  3. springboot+shiro+jwt实现token认证登录

    准备: springboot 2.5.5 jdk 1.8 没有操作刷新token功能,也没有放redis做缓存 1.先贴代码 2.后讲一下验证逻辑 1.导入依赖 <!--shiro-->& ...

  4. SpringSecurity - 整合JWT使用 Token 认证授权

    一.SpringSecurity 前面讲解了SpringSecurity的动态认证和动态权限角色,我们都知道在现在大多都是微服务前后端分离的模式开发,前面讲的还是基于Session的,本篇我们整合JW ...

  5. Java实现Token登录验证(基于JWT的token认证实现)

    文章目录 一.JWT是什么? 二.使用步骤 1.项目结构 2.相关依赖 3.数据库 4.相关代码 三.测试结果 一.JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流 ...

  6. 接口使用jwt返回token_基于JWT的token认证

    阿里云API网关在Json Web Toke(JWT)这种结构化令牌的基础上实现了一套基于用户体系对用户的API进行授权访问的机制,满足用户个性化安全设置的需求. 一.基于token的认证 1.1 简 ...

  7. Django+JWT实现Token认证

    对外提供API不用django rest framework(DRF)就是旁门左道吗? 基于Token的鉴权机制越来越多的用在了项目中,尤其是对于纯后端只对外提供API没有web页面的项目,例如我们通 ...

  8. PHP 接口开发使用 lcobucci/jwt 进行 Token 认证时提示 Error while decoding to JSON 解决方法

    在 Stack Overflow 提过这个问题,很快就被网友解答了,非常感谢,有兴趣的朋友可以去瞧瞧我的渣英文.How to validate the user JWT pass over Token ...

  9. 使用JWT实现Token认证

    为什么使用JWT? 随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用 ...

最新文章

  1. MVC HtmlHelper用法大全
  2. 搭建prometheus+grafana监控系统
  3. Mvc全局过滤器与Action排除
  4. ElasticSearch评分分析 explian 解释和一些查询理解
  5. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
  6. Windows Server 2012 禁止使用Ctrl+Alt+Del 以及禁止开机启动服务器管理器
  7. Oracle入门《Oracle介绍》第一章1-4 Oracle 用户管理
  8. c4d支持mac系统渲染器有哪些_C4D的几大主流渲染器
  9. ArcGIS Server中各种服务详解
  10. html5 右侧客服代码,简洁右侧栏客服代码
  11. 国内主流Arduino图形化编程软件专业评测
  12. 微博三方登陆-02.微博开放平台注册及使用
  13. 最新GEP分销系统网站源码官方
  14. 商品期货交易开仓上限(商品期货开仓限制)
  15. 台式机通过网线连接笔记本上网
  16. 弘辽科技:惊!原来吸引淘宝买家眼球的标题是这么写出来的!
  17. 大学生前端,毕业面试知道这几点,offter拿到手软
  18. 含有一般疑问句的歌_七年级——一般现在时
  19. word 批量给表格增加题注
  20. 我用Python分析5W+视频数据,看看谁才是最咕UP主

热门文章

  1. 【报告分享】2022微信视频号生态发展研究报告.pdf(附下载链接)
  2. 深度学习福利入门到精通第二讲——AlexNet模型
  3. Dive into BERT:语言模型与知识
  4. 导轮式机器人_轮式移动机器人导航控制与路径规划研究
  5. 独立站国际物流怎么解决?
  6. 成像反了_宋国荣, 窦致夏:快速超声 C 扫描成像中的信号频域分析法及其应用...
  7. Java-Set、Map
  8. 花书+吴恩达深度学习(二十)构建模型策略(超参数调试、监督预训练、无监督预训练)
  9. HttpClientHelper的封装
  10. jupyter notebook 安装教程