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

相关文章
|
6月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
333 0
|
4月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
【10月更文挑战第2天】在当今互联网世界中,数据安全与隐私保护日益重要。Python 作为广泛应用于 Web 开发的语言,其认证机制也不断进化。OAuth 2.0 和 JSON Web Tokens (JWT) 成为当前最热门的安全认证方案,不仅保障数据安全传输,还简化了用户认证流程。本文将介绍 Python 如何结合 OAuth 2.0 和 JWT 打造安全高效的认证体系。
50 3
|
1月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
82 11
|
6月前
|
存储 JSON 安全
从入门到精通:Python中的OAuth与JWT,打造无懈可击的认证体系🔒
【8月更文挑战第4天】构建现代Web和移动应用时,用户认证与授权至关重要。Python集成OAuth和JWT技术,能轻松实现安全认证。本文从OAuth基础入手,介绍如何使用`requests-oauthlib`库简化流程,再到JWT进阶应用,利用`PyJWT`库生成及验证令牌。最后,探讨如何结合两者,创建无缝认证体验。通过代码示例,由浅入深地引导读者掌握构建坚固应用认证体系的方法。
138 2
|
3月前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
108 8
|
3月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
在当今互联网世界中,数据安全和隐私保护至关重要。Python 作为 Web 开发的主流语言,其认证机制也在不断进步。OAuth 2.0 和 JSON Web Tokens (JWT) 是当前最热门的安全认证方案,不仅保障数据安全传输,还简化用户认证流程。本文介绍如何在 Python 中结合 OAuth 2.0 和 JWT,打造一套既安全又高效的认证体系。通过 Flask-HTTPAuth 和 PyJWT 等库,实现授权和验证功能,确保每次请求的安全性和便捷性。
60 3
|
3月前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
173 2
|
5月前
|
安全 Java 数据安全/隐私保护
|
5月前
|
JSON 安全 数据安全/隐私保护
Python 安全性大揭秘:OAuth 与 JWT,不只是认证,更是信任的传递
【9月更文挑战第4天】在数字化时代,确保应用安全至关重要。Python 作为广泛使用的编程语言,提供了强大的安全认证工具,如 OAuth 和 JWT。OAuth 是一种授权框架,允许第三方应用在有限权限下访问用户资源;JWT 则是一种自包含的数据传输格式,用于安全地传递声明。通过合理配置和使用这些技术,可以有效提升应用安全性,保障用户数据安全。正确管理和定期更新密钥、严格测试 JWT 的生成与验证等最佳实践,对于构建安全可靠的应用至关重要。不断学习新威胁,是维护应用安全的永恒课题。
68 2
|
6月前
|
JSON 安全 数据安全/隐私保护
Python 安全性大揭秘:OAuth 与 JWT,不只是认证,更是信任的传递
【8月更文挑战第6天】在数字化时代,Python 通过 OAuth 和 JWT 筑牢应用安全防线。OAuth 是一种授权框架,允许第三方应用在用户授权下安全访问资源;JWT 则是一种自包含的声明传输格式,确保通信安全。两者结合使用,能有效进行身份验证及授权管理。然而,密钥管理和 JWT 有效期设置等仍是挑战,需谨慎处理以保障整体安全性。正确配置这些工具和技术,可为用户提供既安全又便捷的服务体验。
59 7