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

相关文章
|
4月前
|
安全 Java Spring
Spring Security+jwt实现认证
Spring Security+jwt实现认证
|
1月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
|
1月前
|
存储 JSON 安全
从入门到精通:Python中的OAuth与JWT,打造无懈可击的认证体系🔒
【8月更文挑战第4天】构建现代Web和移动应用时,用户认证与授权至关重要。Python集成OAuth和JWT技术,能轻松实现安全认证。本文从OAuth基础入手,介绍如何使用`requests-oauthlib`库简化流程,再到JWT进阶应用,利用`PyJWT`库生成及验证令牌。最后,探讨如何结合两者,创建无缝认证体验。通过代码示例,由浅入深地引导读者掌握构建坚固应用认证体系的方法。
45 2
|
4月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
180 0
|
5天前
|
安全 Java 数据安全/隐私保护
|
16天前
|
JSON 安全 数据安全/隐私保护
Python 安全性大揭秘:OAuth 与 JWT,不只是认证,更是信任的传递
【9月更文挑战第4天】在数字化时代,确保应用安全至关重要。Python 作为广泛使用的编程语言,提供了强大的安全认证工具,如 OAuth 和 JWT。OAuth 是一种授权框架,允许第三方应用在有限权限下访问用户资源;JWT 则是一种自包含的数据传输格式,用于安全地传递声明。通过合理配置和使用这些技术,可以有效提升应用安全性,保障用户数据安全。正确管理和定期更新密钥、严格测试 JWT 的生成与验证等最佳实践,对于构建安全可靠的应用至关重要。不断学习新威胁,是维护应用安全的永恒课题。
32 2
|
1月前
|
JSON 安全 数据安全/隐私保护
Python 安全性大揭秘:OAuth 与 JWT,不只是认证,更是信任的传递
【8月更文挑战第6天】在数字化时代,Python 通过 OAuth 和 JWT 筑牢应用安全防线。OAuth 是一种授权框架,允许第三方应用在用户授权下安全访问资源;JWT 则是一种自包含的声明传输格式,确保通信安全。两者结合使用,能有效进行身份验证及授权管理。然而,密钥管理和 JWT 有效期设置等仍是挑战,需谨慎处理以保障整体安全性。正确配置这些工具和技术,可为用户提供既安全又便捷的服务体验。
31 7
|
1月前
|
JSON 安全 数据安全/隐私保护
Python安全新篇章:OAuth与JWT携手,开启认证与授权的新时代
【8月更文挑战第6天】随着互联网应用的发展,安全认证与授权变得至关重要。本文介绍OAuth与JWT两种关键技术,并展示如何结合它们构建安全系统。OAuth允许用户授权第三方应用访问特定信息,无需分享登录凭证。JWT是一种自包含的信息传输格式,用于安全地传递信息。通过OAuth认证用户并获取JWT,可以验证用户身份并保护数据安全,为用户提供可靠的身份验证体验。
33 6
|
1月前
|
JSON 人工智能 算法
Golang 搭建 WebSocket 应用(四) - jwt 认证
Golang 搭建 WebSocket 应用(四) - jwt 认证
34 0
|
1月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
【8月更文挑战第5天】在日益重视数据安全与隐私保护的互联网时代,Python 作为一种流行的 Web 开发语言,其认证机制不断演进。OAuth 2.0 与 JSON Web Tokens (JWT) 成为两大热门安全认证方案,既能保障数据安全传输,又能简化用户认证流程。OAuth 2.0 通过角色分配(如资源拥有者、客户端等)实现授权,而 JWT 则以自我包含式令牌简化认证过程。在 Python 中,可以利用 Flask-OAuthlib 和 PyJWT 等库轻松实现这两种认证方式。
23 0

热门文章

最新文章