idc销售网站源码,章丘网站开发培训,网站开发的试用期条款,自己做网站 搜索功能开发1.JWT是什么#xff1f;
jwt#xff08;json web token的缩写#xff09;是一个开放标准#xff08;rfc7519#xff09;#xff0c;它定义了一种紧凑的、自包含的方式#xff0c;用于在各方之间以json对象安全地传输信息#xff0c;此信息可以验证和信任#xff0c;因…1.JWT是什么
jwtjson web token的缩写是一个开放标准rfc7519它定义了一种紧凑的、自包含的方式用于在各方之间以json对象安全地传输信息此信息可以验证和信任因为它是数字签名的jwt可以使用秘密使用HMAC算法或使用RSA或ECDSA的公钥/私钥对进行签名。
通俗解释JWT简称JSON Web Token,也就是通过JSON形式作为Web应用中的令牌用于在各方之间安全地将信息作为JSON对象传输在数据传输过程中还可以完成数据加密、签名等相关处理。
2.JWT能做什么
2.1 授权
使用JWT的最常见方案一旦用户登录每个后续请求将包括JWT从而允许用户访问该令牌允许的路由、服务和资源单点登录是当今广泛使用JWT的一项功能因为他的开销很小并且可以在不同的域中轻松使用。
2.2 信息交换
JSON Web Token是在各方之间安全地传输信息的好方法因为可以对JWT进行签名例如使用公钥/私钥对所以您可以确保发件人是他们所说的人此外由于签名是使用标头和有效负载计算的因此你还可以验证内容是否遭到篡改。 作用传输数据和安全验证其主要会用在安全验证
3. 基于JWT认证
3.1 认证流程 首先前端通过Web表单将自己的用户名和密码发送到后端的接口这一过程一般是一个HTTP POST请求建议的方式是通过SSL传输https协议从而避免敏感信息被嗅探后端核对用户名和密码成功后将用户的id等其他信息作为JWT Payload(负载)将其与头部分别进行Based64编码拼接后签名形成一个JWT(token),形成的JWT就是一个形同lll.zzz.xxx的字符串token、head.payload、singurater三部分组成中间用点.连接;后端将JWT字符串作为登录成功的返回结果返回给前端前端可以将返回的结果保存在localStorage或sessionStorage上退出登录时前端删除保存的JWT即可前端在每次请求时将JST放入HTTP Header中的Authorization位解决XSS和XSRF问题-防伪跨拦截攻击后端检查是否存在如存在验证JWT的有效性例如检查签名是否正确检查Token是否过期检查Token的接收方是否是自己可选验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作返回相应的结果
3.2 JWT优势
简洁compact可以通过URLPOST参数或在HTTP header发送因为数据量小传输速度也很快自包含Self-contained:负载中包含了所有用户所需要的信息避免了多次查询数据库因为token是以json加密的形式保存在客户端的所以JWT是跨语言的原则上任何web形式都支持不需要在服务端保存会话信息特别适用于分布式微服务
4.JWT组成
4.1 令牌组成
令牌就是token类型为Stringx(标头header).y(payload负载).z(签名signature)三段组成
标头Header;有效载荷payload签名signature
4.2 Header
//标头通常是由两部分组成令牌的类型即JWT和使用的签名算法例如HMAC、SHA256或RSA它会使用Base64编码组成JWT 结构的第一部分 //注意Base64是一种编码也就是说它是可以被翻译回原来的样子它并不是一种加密过程
//jwt将下面的头信息数据进行Base64编码类似于加密后期是可以进行解码
//头部的默认值后期可直接使用默认不再重新写
{alg:HS256,typ:JWT
}4.3 Payload
//令牌的第二部分是有效负载自包含其中包含声明声明式有关实体通常是用户-用户名、用户id等和其他数据的声明同样的它会使用Base64编码组成JWT结构的第二部分
//注意第二部分的有效负载不要放用户特别敏感的信息例如密码
//jwt将下面的头信息数据进行Base64编码类似于加密后期是可以进行解码
{sub:12345678,name:xx,admin:true
}4.4 Signature
前面两部分都是使用Base64进行编码的即前端可以解开知道里面的信息Sigurate需要使用编码后的header和payload以及我们提供的一个密钥然后使用header中指定的签名算法HS256进行签名签名的作用是保证JWT没有被篡改过 hederpayload随机签名(保密性极高) 如
HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload).secret)签名目的 最后一步签名的过程实际上是对头部以及负载内容进行签名防止内容被篡改如果有人对头部以及负载的内容编码之后进行修改在进行编码最后加上之前的签名组合形成新的JWT的话那么服务器就会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的如果要对新的头部和负载进行签名在不知道服务器加密是用的密钥的话得出来的签名也是不一样的
信息安全问题 1.Base64是一种编码是可逆的那么我的信息不就被暴露了吗 答在JWT中不应该在负载中加入任何敏感的数据在上面的例子中我们传输的是用户的User ID,这个值实际上不是什么敏感内容一般情况下被知道也是安全的但是像密码这样的内容就不能被放在JWT中了如果将用户的密码放在了JWT中那么怀有恶意的第三方通过Base64解码就能很快的知道你的密码了因此JWT适合用于向Web应用传递一些非敏感信息JWT还经常用户设计用户认证和授权系统甚至实现web应用的单点登录。
5.使用JWT
可以直接去官网中看与springboot的集成
5.1引入依赖
!--引入依赖--
dependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion3.4.8/version
/dependency5.2 生成token
Calendar instance Calendar.getInstance();
instance.add(Calendar.SECOND,99);
//生成令牌
HashMapString,Object mapnew HashMap();//用于存放自定义的头部数据
Calendar instanceCalendar.getInstance().add(Calendar.SECOND.90); //过期实际按
String token JWT.create().withHeader(map) //header.withClaim(username,张三) //payload 设置自定义用户名,即只能放一个.withExpiresAT(instance.getTime()) //设置过期时间.sign(Algorithm.HMAC256(token!Q2W#SRW));//Signature 设置签名保密复杂
System.out.pringln(token);5.3 根据令牌和签名解析数据 //创建验证对象
JWTVerfier jwtVerifier JWT.require(Algorithm.HMAC256(:Q0w#ESR)).build();
DecodeJWT verifyjwtVerifier.verify(token数据); //解密tokenverify.getClaim(token负载中传的值).asString(); //获取解密得到token中的具体的值6.封装工具类
//1.生成token
//2.验证token
7.springboot整合JWT
引入依赖 jwt、数据库有关依赖、编写配置