JWT-JWT-入门指南-了解-及其运行好处 (今晚天津卫视你看谁来了)
目前传统的后盾治理系统,以及不经常使用第三方登录的系统,经常使用JWT技术的还是挺多的,因此在面试中被问到的频率也比拟高,所以当天咱们就来看一下:什么是JWT?为什么要用JWT?
1.什么是JWT?
JWT(JSONWebToken)是一种开明规范(RFC7519),用于在网络上安保传输消息的繁复、自蕴含的方式。它理论被用于身份验证和授权机制。JWT由三局部组成:头部(Header)、载荷(Payload)和签名(Signature)。
2.为什么要用JWT?
JWT相较于传统的基于会话(Session)的认证机制,具有以下好处:
总结来说,经常使用JWT相较于传统的基于会话的认证机制,可以缩小主机存储开支和治理复杂性,成功跨域允许和水平裁减,并且更顺应有形态和微服务架构。
3.JWT基本经常使用
在开发中,可以借助JWT工具类来繁难的操作JWT,例如HuTool框架中的JWTUtil。
HuTool引见:
经常使用HuTool操作JWT的步骤如下:
3.1增加HuTool框架依赖
在pom.xml中增加以下消息:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>
3.2生成Token
Map<String,Object>map=newHashMap<String,Object>(){privatestaticfinallongserialVersionUID=1L;{put("uid",Integer.parseInt("123"));//用户IDput("expire_time",System.currentTimeMillis()+1000*60*60*24*15);//过时期间15天}};JWTUtil.createToken(map,"主机端秘钥".getBytes());
3.3验证和解析Token
验证Token的示例代码如下:
Stringtoken="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHOjE2MjQwMDQ4MjIsInVzZXJJZCI6MSwiYXV0aG9yaXRpZXMiOlsiUk9MRV_op5LoibLkuozlj7ciLCJzeXNfbWVudV8xIiwiUk9MRV_op5LoibLkuIDlj7ciLCJzeXNfbWVudV8yIl0sImp0aSI6ImQ0YzVlYjgwLTA5ZTctNGU0ZC1hZTg3LTVkNGI5M2FhNmFiNiIsImNsaWVudF9pZCI6ImhhbmR5LXNob3AifQ.aixF1eKlAKS_k3ynFnStE7-IRGiD5YaqznvK2xEjBew";JWTUtil.verify(token,"123456".getBytes());
解析Token的示例代码如下:
StringrightToken="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9.U2aQkC2THYV9L0fTN-yBBI7gmo5xhmvMhATtu8v0zEA";finalJWTjwt=JWTUtil.parseToken(rightToken);jwt.getHeader(JWTHeader.TYPE);jwt.getPayload("sub");
3.4代码实战
![JWT](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
在登录成功之后,生成Token的示例代码如下:
//登录成功,经常使用JWT生成TokenMap<String,Object>payload=newHashMap<String,Object>(){privatestaticfinallongserialVersionUID=1L;{put("uid",userinfo.getUid());put("manager",userinfo.getManager());//JWT过时期间为15天put("exp",System.currentTimeMillis()+1000*60*60*24*15);}};Stringtoken=JWTUtil.createToken(payload,Variable.JWT_KEY.getBytes());
例如在SpringCloudGateway网关中验证Token的实现代码如下:
importcn.hutool.jwt.JWT;importcn.hutool.jwt.JWTUtil;importcom.example.common.AppVariable;importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springframework.core.Ordered;importorg.springframework.http.HttpStatus;importorg.springframework.http.server.reactive.ServerHttpResponse;importorg.springframework.stereotype.Component;importorg.springframework.web.server.ServerWebExchange;importreactor.core.publisher.Mono;importjava.util.List;/***登录过滤器(登录判别)*/@ComponentpublicclassAuthFilterimplementsGlobalFilter,Ordered{//扫除登录验证的URL地址privateString[]skipAuthUrls={"/user/add","/user/login"};@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){//以后恳求的URLStringurl=exchange.getRequest().getURI().getPath();for(Stringitem:skipAuthUrls){if(item.equals(url)){//继续往下走returnchain.filter(exchange);}}ServerHttpResponseresponse=exchange.getResponse();//登录判别List<String>tokens=exchange.getRequest().getHeaders().get(AppVariable.TOKEN_KEY);if(tokens==null||tokens.size()==0){//以后未登录response.setStatusCode(HttpStatus.UNAUTHORIZED);returnresponse.setComplete();}//token有值Stringtoken=tokens.get(0);//JWT效验token能否有效booleanresult=false;try{result=JWTUtil.verify(token,AppVariable.JWT_KEY.getBytes());}catch(Exceptione){result=false;}if(!result){//有效tokenresponse.setStatusCode(HttpStatus.UNAUTHORIZED);returnresponse.setComplete();}else{//判别token能否过时finalJWTjwt=JWTUtil.parseToken(token);//失掉过时期间ObjectexpObj=jwt.getPayload("exp");if(expObj==null){response.setStatusCode(HttpStatus.UNAUTHORIZED);returnresponse.setComplete();}longexp=Long.parseLong(expObj.toString());if(System.currentTimeMillis()>exp){//token过时response.setStatusCode(HttpStatus.UNAUTHORIZED);returnresponse.setComplete();}}returnchain.filter(exchange);}@OverridepublicintgetOrder(){//值越小越早口头return1;}}
4.成功原理剖析
JWT实质是将秘钥寄存在主机端,并经过某种加密手腕启动加密和验证的机制。加密签名=某加密算法(header+payload+主机端私钥),由于服务端私钥他人不能失掉,所以JWT能保障自身其安保性。
小结
为什么jwt就是安全的?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的, 特别适用于分布式站点的单点登录(SSO)场景。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息, 以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT token封装以及自动刷新方案建议
什么是JWT 用户登录操作 在前后分离场景下,越来越多的项目使用jwt token作为接口的安全机制,但存在jwt过期后,用户无法直接感知,假如在用户操作页面期间,突然提示登录,则体验很不友好,所以就有了token自动刷新需求; 方案:前端控制检测token,无感知刷新 用户登录成功的时候,一次性给他两个Token,分别为AccessToken和RefreshToken AccessToken有效期较短,比如1天或者5天,用于正常请求 RefreshToken有效期可以设置长一些,例如10天、20天,作为刷新AccessToken的凭证 刷新方案:当AccessToken即将过期的时候,例如提前30分钟,客户端利用RefreshToken请求指定的API获取新的AccessToken并更新本地存储中的AccessToken 核心逻辑 1、登录成功后,jwt生成AccessToken; UUID生成RefreshToken并存储在服务端redis中,设置过期时间 2、接口返回3个字段AccessToken/RefreshToken/访问令牌过期时间戳 3、由于RefreshToken存储在服务端redis中,假如这个RefreshToken也过期,则提示重新登录; 老王的疑问:RefreshToken有效期那么长,和直接将AccessToken的有效期延长有什么区别答:RefreshToken不像AccessToken那样在大多数请求中都被使用,主要是本地检测accessToken快过期的时候才使用, 一般本地存储的时候,也不叫refreshToken,前端可以取个别名,混淆代码让攻击者不能直接识别这个就是刷新令牌 缺点:前端每次请求需要判断token距离过期时间 优点:后端压力小,代码逻辑改动不大 刷新token方法未实现。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。