备案 控制台
开发者社区 开发与运维 文章 正文

JWT认证方案讲解

简介: 你好看官,里面请!今天笔者讲的是JWT认证方案。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。

JWT认证方案讲解

在介绍JWT,先提一下session认证方案。

session和cookie的验证流程图

Cookie中带的是每个用户独有的sessionID。

image.png

session的安全性

session ID生成规则:随机数加时间加上JVM的ID值

每个用户都有自己独有的session ID。

session劫持和防护

session劫持:

sessionID被他人获取并伪造成用户本人。

session防护:

  • HttpOnly:不允许前端读取
  • Secure:仅支持HTTPS

session的缺点

扩展性差:如果将来搭建了多个服务器,虽然每个服务器都执行的是同样的业务逻辑,但是session数据是保存在内存中的(不是共享的),用户第一次访问的是服务器1,当用户再次请求时可能访问的是另外一台服务器2,服务器2获取不到session信息,就判定用户没有登陆过。

需要服务端存储数据:通常session是存储在内存中的,每个用户通过认证之后都会将session数据保存在服务器的内存中,而当用户量增大时,服务器的压力增大。

JWT

JWT是一种流行的认证方案

JWT原理

在http请求中携带的是左边的经过编码的字符串,服务器会解码成右边的部分。

image.png

header.payload.signature

头部(Header) alg指的是签名算法为HS256

image.png

消息体(Payload)

image.png

签名(Signature):检查消息体是否被篡改过,对信息体的数据进行保护,防止被篡改。

image.png

JWT流程

image.png

session和JWT对比

session的优缺点

优点:简单、方便

缺点:扩展性差、需要存储数据

JWT的优点

减少存储开销

可扩展性强

同时用于认证和交换信息:JWT直接将信息携带传输。

防止被伪造和篡改:签名机制防止被伪造。

JWT的缺点

默认不加密,不适合保存敏感信息

无法临时废止、登出需要额外处理

有效期不易评估

网络开销相对高

项目实战

首先引入依赖

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.14.0</version></dependency>

userController控制类下的登陆方法:(设置JWT)

@GetMapping("/loginWithJwt")
@ResponseBodypublicApiRestResponseloginWithJwt(@RequestParamStringuserName, @RequestParamStringpassword) {
if (StringUtils.isEmpty(userName)) {
returnApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);
    }
if (StringUtils.isEmpty(password)) {
returnApiRestResponse.error(ImoocMallExceptionEnum.NEED_PASSWORD);
    }
Useruser=userService.login(userName, password);
//保存用户信息时,不保存密码user.setPassword(null);
Algorithmalgorithm=Algorithm.HMAC256(Constant.JWT_KEY);
Stringtoken=JWT.create()
            .withClaim(Constant.USER_NAME, user.getUsername())
            .withClaim(Constant.USER_ID, user.getId())
            .withClaim(Constant.USER_ROLE, user.getRole())
//过期时间            .withExpiresAt(newDate(System.currentTimeMillis() +Constant.EXPIRE_TIME))
            .sign(algorithm);
returnApiRestResponse.success(token);
}

用户过滤器从JWT中获取数据

/*** 描述:     用户过滤器*/publicclassUserFilterimplementsFilter {
publicstaticThreadLocal<User>userThreadLocal=newThreadLocal();
publicUsercurrentUser=newUser();
@AutowiredUserServiceuserService;
@Overridepublicvoidinit(FilterConfigfilterConfig) throwsServletException {
    }
@OverridepublicvoiddoFilter(ServletRequestservletRequest, ServletResponseservletResponse,
FilterChainfilterChain) throwsIOException, ServletException {
HttpServletRequestrequest= (HttpServletRequest) servletRequest;
if ("OPTIONS".equals(request.getMethod())) {
filterChain.doFilter(servletRequest, servletResponse);
        } else {
Stringtoken=request.getHeader(Constant.JWT_TOKEN);
if (StringUtils.isEmpty(token)) {
PrintWriterout=newHttpServletResponseWrapper(
                        (HttpServletResponse) servletResponse).getWriter();
out.write("{\n"+"    \"status\": 10007,\n"+"    \"msg\": \"NEED_LOGIN\",\n"+"    \"data\": null\n"+"}");
out.flush();
out.close();
return;
            }
Algorithmalgorithm=Algorithm.HMAC256(Constant.JWT_KEY);
JWTVerifierverifier=JWT.require(algorithm).build();
try {
DecodedJWTjwt=verifier.verify(token);
currentUser.setId(jwt.getClaim(Constant.USER_ID).asInt());
currentUser.setRole(jwt.getClaim(Constant.USER_ROLE).asInt());
currentUser.setUsername(jwt.getClaim(Constant.USER_NAME).asString());
userThreadLocal.set(currentUser);
            } catch (TokenExpiredExceptione) {
//token过期,抛出异常thrownewImoocMallException(ImoocMallExceptionEnum.TOKEN_EXPIRED);
            } catch (JWTDecodeExceptione) {
//解码失败,抛出异常thrownewImoocMallException(ImoocMallExceptionEnum.TOKEN_WRONG);
            }
filterChain.doFilter(servletRequest, servletResponse);
        }
    }
@Overridepublicvoiddestroy() {
    }
}

前端把jwt_token(这个名称需要前后端统一规定)封装在请求头中发给后端。

image.png

JacksonZhang
目录
相关文章
vohelon
|
1月前
|
JSON JavaScript 数据格式
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
vohelon
68 1
程序三两行
|
1月前
|
安全 Java Spring
Spring Security+jwt实现认证
Spring Security+jwt实现认证
程序三两行
52 0
程序三两行
|
1月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
程序三两行
115 0
真的很搞笑
|
10天前
|
消息中间件 Serverless Go
Serverless 应用引擎操作报错合集之通过自定义域名配置jwt认证,始终报错:"Code": "JWTTokenIsInvalid",是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
真的很搞笑
17 2
什么时候能躺平
|
27天前
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
什么时候能躺平
35 1
Jack_hrx
|
6天前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Jack_hrx
18 0
月木天上
|
1月前
|
JSON SpringCloudAlibaba Cloud Native
SpringCloudAlibaba:4.3云原生网关higress的JWT 认证
SpringCloudAlibaba:4.3云原生网关higress的JWT 认证
月木天上
31 1
真的很搞笑
|
1月前
|
运维 Serverless API
Serverless 应用引擎产品使用之阿里函数计算中要关掉http触发器的jwt认证才可以进行性能探测如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
真的很搞笑
21 1
阿里云云原生
|
1月前
|
负载均衡 Cloud Native 安全
云原生最佳实践系列 6:MSE 云原生网关使用 JWT 进行认证鉴权
本文档介绍了如何在 MSE(Microservices Engine)云原生网关中集成JWT进行全局认证鉴权。
阿里云云原生
876 8
梦回故国楼台梦
|
1月前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
梦回故国楼台梦
72 0

热门文章

最新文章

  • 1
    ❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
  • 2
    使用JWT的服务分布式部署之后报错:JWT Check Failure:
  • 3
    切图仔做全栈:React&Nest.js社区平台(一)——基础架构与邮箱注册、JWT登录实现
  • 4
    node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
  • 5
    微服务之Springboot整合Oauth2.0 + JWT
  • 6
    Serverless 应用引擎产品使用之阿里函数计算中要关掉http触发器的jwt认证才可以进行性能探测如何解决
  • 7
    搞懂单点登录SSO,基于SpringBoot+JWT实现单点登录解决方案
  • 8
    如何在SpringBoot中集成JWT(JSON Web Token)鉴权
  • 9
    使用JWT简化http接口鉴权,告别烦人的加密、解密代码吧
  • 10
    自己写token类(无视jwt)
  • 1
    切图仔做全栈:React&Nest.js社区平台(一)——基础架构与邮箱注册、JWT登录实现
    46
  • 2
    Serverless 应用引擎产品使用之阿里函数计算中要关掉http触发器的jwt认证才可以进行性能探测如何解决
    21
  • 3
    node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
    38
  • 4
    使用JWT的服务分布式部署之后报错:JWT Check Failure:
    57
  • 5
    微服务之Springboot整合Oauth2.0 + JWT
    27
  • 6
    ❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
    58
  • 7
    JWT解密:探秘令牌魔法与Java的完美交互
    29
  • 8
    Springboot+Spring security +jwt认证+动态授权
    115
  • 9
    SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
    104
  • 10
    面试官:Session和JWT有什么区别?
    51
  • 相关电子书

    更多
  • 安全机制与User账户身份验证实战
  • 低代码开发师(初级)实战教程
  • 阿里巴巴DevOps 最佳实践手册
  • 下一篇
    基于函数计算模板部署AI应用实践

    PHP网站源码大运百搜标王福永网页设计坑梓网站优化按天计费同乐网站优化塘坑seo排名横岗网站推广塘坑网站改版南山营销型网站建设沙井模板网站建设大芬标王民治外贸网站制作坪地设计网站木棉湾百度竞价坪地百姓网标王推广爱联推广网站宝安SEO按天扣费丹竹头建设网站南联建设网站罗湖网站设计模板荷坳阿里店铺运营坪地网站设计吉祥建设网站福永百搜词包沙井外贸网站建设木棉湾seo网站推广爱联至尊标王西乡百姓网标王推广坂田网站开发盐田标王盐田网页设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化