JwtToken介绍与使用 超详细保姆级教程 内附详细示例代码
文章目录
- 一、什么是JWT认证
- 二、JWT认证的特点
- 优点:
- 缺点:
- 三、JWT的组成
- 四、JWT代码展示
一、什么是JWT认证
Json web token (JWT),根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
二、JWT认证的特点
优点:
1.体积小,因而传输速度快
2.传输方式多样,可以通过URL/POST参数/HTTP头部等方式传输
3.严格的结构化。它自身(在 payload 中)就包含了所有与用户相关的验证消息,如用户可访问路由、访问有效期等信息,服务器无需再去连接数据库验证信息的有效性,并且 payload 支持为你的应用而定制化。
4.支持跨域验证,可以应用于单点登录
缺点:
1.安全性
由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。
2.性能
jwt太长。由于是无状态使用JWT,所有的数据都被放到JWT里,如果还要进行一些数据交换,那载荷会更大,经过编码之后导致jwt非常长,cookie的限制大小一般是4k,cookie很可能放不下,所以jwt一般放在local storage里面。并且用户在系统中的每一次http请求都会把jwt携带在Header里面,http请求的Header可能比Body还要大。而sessionId只是很短的一个字符串,因此使用jwt的http请求比使用session的开销大得多。
3.一次性
无状态是jwt的特点,但也导致了这个问题,jwt是一次性的。想修改里面的内容,就必须签发一个新的jwt。
三、JWT的组成
JWT由三部分组成:header(头部)、payload(载荷)、signature(签名)
JWT的格式为:header.payload.signature
加密后的样例展示:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6ImMyMGFkNGQ3NmZlOTc3NTlhYTI3YTBjOTliZmY2NzEwIiwiaWQiOjksImV4cCI6MTYzODM3Mjk5NSwiaWF0IjoxNjM3NzY4MTk1LCJ1c2VybmFtZSI6IjEyIn0.tslCAlrbk2m4YTiHhxW5exFe0JbwWaDSWG0xI8F4Vmg
接下来详细介绍三者的组成:
1.header(头部)
JWT头部一般包含两部分信息:
1)typ(类别)
2)alg(加密算法,常用的是HMAC256、SHA256)
示例:
{"alg": "HMAC256","typ": "JWT"
}
之后将头部的内容进行base64加密(这种加密是能够对称解密的),加密之后就构成了第一部分:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。
2.payload(载荷)
JWT的载荷部分是存放有效信息的地方,对于安全性比较高的程序,一般建议不要存放敏感信息,一般包含三部分信息:
1)需要添加进去的有效信息
2)token的签发时间和过期时间
3)私有的声明
示例:
{"username": username,"password": password,"id": id,"iat": iatDate, // 签发时间"exp": expiresDate // 过期时间...
}
同样将上述json对象进行base64加密后可以得到第二部分token字符串:eyJwYXNzd29yZCI6ImMyMGFkNGQ3NmZlOTc3NTlhYTI3YTBjOTliZmY2NzEwIiwiaWQiOjksImV4cCI6MTYzODM3Mjk5NSwiaWF0IjoxNjM3NzY4MTk1LCJ1c2VybmFtZSI6IjEyIn0
3.signature(签名)
这一部分一般设置一个公用密钥进行加密,只能在服务端解密。
四、JWT代码展示
JwtToken工具类
package com.kkkoke.networkrepair.util.token;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.kkkoke.networkrepair.util.MD5Util;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JwtToken {/** 公用密钥-保存在服务端,客户端是不知道密钥的,以防被攻击* */public static String SECRET = "kkkoke2021";// String username, String passwordpublic static String creatToken(String username, String password, Long id) throws Exception {// 签发时间Date iatDate = new Date();// 过期时间Calendar nowTime = Calendar.getInstance();nowTime.add(Calendar.DAY_OF_WEEK, 7);Date expiresDate = nowTime.getTime();Map<String, Object> map = new HashMap<>();map.put("alg", "HMAC256");map.put("typ", "JWT");String token = JWT.create().withHeader(map) // header.withClaim("username", username) // payload.withClaim("password", password).withClaim("id", id).withExpiresAt(expiresDate) // 设置过期时间。过期时间要大于签发时间.withIssuedAt(iatDate) // 设置签发时间.sign(Algorithm.HMAC256(SECRET)); // 加密return token;}/** 解密Token* */public static Map<String, Claim> verifyToken(String token) throws Exception {JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();DecodedJWT jwt = null;try {jwt = verifier.verify(token);} catch (Exception e) {throw new RuntimeException("登录凭证已过去,请重新登录");}return jwt.getClaims();}
}
解析示例
Map<String, Claim> jwt = JwtToken.verifyToken(token);
String username = jwt.get("username").asString();// 提取解析出的username
String password = jwt.get("password").asString();// 提取解析出的password
// 提取其他解析出来的内容也是一样的,希望对大家有帮助
JwtToken介绍与使用 超详细保姆级教程 内附详细示例代码相关推荐
- 别找了,小程序实现isbn扫码获取图书信息2022最新可用(保姆级教程内附接口)
关注.收藏.点赞3连
- JavaScript保姆级教程 ——— 重难点详细解析(万字长文,建议收藏)
JavaScript保姆级教程 --- 重难点详细解析(建议收藏) 1. JS函数 2. JS事件 3. JavaScript 对象 4. JavaScript prototype(原型对象) 5. ...
- 动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解
动态规划27k字超详细保姆级入门讲解 写在前面: 这篇文章是目前为止我写过最长也是最久的文章,前面关于DP的讲解我查阅了大量的博客资料,学习其他博主对DP的理解,也翻阅了很多经典的纸质书籍,同时做了近 ...
- (超详细保姆级教程)CISCN_2023--Web-Unzip(内有做题网站)
CISCN_2023--Web-Unzip 做题网站:ctf.show 打开之后是一个上传框,随便上传一张图片,显示: <?php error_reporting(0); highlight ...
- Anaconda介绍、安装及使用保姆级教程
Python是一种面向对象的解释型计算机程序设计语言,其使用,具有跨平台的特点,可以在Linux.macOS以及Windows系统中搭建环境并使用,其编写的代码在不同平台上运行时,几乎不需要做较大的改 ...
- 零基础DIY四轴飞行器超级详细保姆级教程(STM32F407ZGT6主控、WIFI图传、陀螺仪平衡、气压计/超声波定高、手机蓝牙控制等功能)
前言 大四毕业后暑假没事做就花了一点DIY了一个四轴飞行器,是比较大的那种F450机架,不是那种PCB板做机架的小四轴,因为我也是从零基础开始做的四轴,现在就想把自己的过程写成博客分享在网上.下面我会 ...
- 青龙面板搭建(狗东代挂)搭建详细保姆级教程
前言:青龙面板是一套支持python3.javaScript.shell.typescript的定时任务面板,因为脚本需要定时运行所以最好安装在服务器上. 正文: 1.购买服务器 推荐阿里云或者腾讯云 ...
- shell脚本保姆级教程,附赠100个shell脚本案例!
无论是系统运维,还是应用运维,均可分为"**纯手工"-> "脚本化"-> "自动化"->"智能化"** ...
- Hoxx使用保姆级教程【附截图| 安卓苹果电脑】
Hoxx是一款虚拟的个人 proxy 工具,老外使用的话,一般是想在互联网上保持安全,防止信息被他人知道.在国人里,用途比较宽泛,看到别人有追星族在用,比如去ins上看周杰伦发动态:也有留学生在口罩期 ...
最新文章
- 不借助Maven,使用Eclipse创建Hello World级别的Spring项目
- SequoiaDB 系列源码分析调整
- iScroll的相关使用
- R语言-实用功能性语句1
- Android系统信息获取 之六:网络连接状态信息获取
- Machine Learning——Homework1
- nullnullvc中加花
- JAVA各种加密与解密方式(精挑版)
- 2019年1024,deepin安装原生Linux QQ
- android studio 初始化项目加载时间过长或失败问题解决
- 年度最高奖金【双百万】:2021年全国人工智能大赛开赛啦
- python爬虫记录
- 做好社群营销的4点策略
- Funcode-Q版泡泡堂
- 为开发者而生的Twig(上)-Twig使用指南
- 计算机毕业设计SSM大学生健康管理系统的设计与实现【附源码数据库】
- 人工智能学习笔记20221008
- 微服务开源生态报告 No.7
- 图腾42u服务器机柜型号,图腾42u机柜一般多少斤
- AutoCAD中程序创建Ribbon界面执行AutoCAD命令