基于 JWT 进行身份验证

一、JWT 介绍

在这里插入图片描述
JWT 本质上就是一组字串,通过(.)切分成三个为 Base64 编码的部分:

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
  • Payload : 用来存放实际需要传递的数据
  • Signature(签名):服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。

JWT 通常是这样的:xxxxx.yyyyy.zzzzz。
示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

二、实现代码

1. 添加依赖
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.19.7</version> <!-- 请检查最新版本 -->
</dependency>
2. 创建JWT工具类

创建一个JWT工具类,用于生成和验证JWT。

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.time.Duration;
import java.time.Instant;public class JwtUtil {private static final String SECRET_KEY = "yourSecretKey"; // 应使用安全的随机密钥private static final Algorithm ALGORITHM = Algorithm.HMAC256(SECRET_KEY);// 生成JWTpublic static String generateToken(String username) {Instant now = Instant.now();Instant expiration = now.plus(Duration.ofDays(1)); // 有效期1天return JWT.create().withSubject(username).withIssuedAt(Date.from(now)).withExpiresAt(Date.from(expiration)).sign(ALGORITHM);}// 解析JWTpublic static DecodedJWT verifyToken(String token) {try {return JWT.require(ALGORITHM).build().verify(token);} catch (Exception e) {return null; // 返回null表示token无效或已过期}}// 获取JWT中的用户名public static String getUsernameFromToken(String token) {DecodedJWT decodedJWT = verifyToken(token);return decodedJWT != null ? decodedJWT.getSubject() : null;}
}
3. 实现登录验证
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LoginController {@PostMapping("/login")public String login(@RequestParam("username") String username, @RequestParam("password") String password) {// 简化起见,直接生成JWT,实际应用中需要验证用户名和密码if (isValidUser(username, password)) { // 假设的验证方法String token = JwtUtil.generateToken(username);return "Bearer " + token; // 返回JWT给客户端} else {return "Invalid credentials";}}// 示例:验证JWT并在后续请求中使用// 这里只是一个示意,实际中可能需要通过过滤器或拦截器来处理@PostMapping("/protectedResource")public String protectedResource(@RequestHeader("Authorization") String authorizationHeader) {if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {String token = authorizationHeader.substring(7); // 去除"Bearer "前缀String username = JwtUtil.getUsernameFromToken(token);if (username != null) {return "Hello, " + username;}}return "Unauthorized";}
}

三、注意事项

注意事项:

  1. 密钥安全:JWT的签名密钥(secret key)是验证JWT真伪的关键。必须确保密钥的安全存储,防止泄露,因为一旦密钥被破解,攻击者就能伪造任意JWT。JWT 安全的核心在于签名,签名安全的核心在密钥。
  2. 过期时间管理:JWT通常包含过期时间(expiration time),以防止无限期的有效性。合理设置过期时间,并处理好刷新令牌(refresh tokens)的逻辑,以平衡安全性与用户体验。
  3. 令牌存储:客户端通常将JWT存储在本地(如LocalStorage或Cookie中),这要求客户端环境的安全性,防止XSS和CSRF攻击。
  4. 令牌泄漏:一旦JWT发出,除非使用黑名单机制,否则无法撤销。如果JWT被盗,直到其过期前都可能被滥用。
  5. 负载大小:JWT的有效载荷(payload)携带用户信息,过大的载荷会导致较大的网络开销和解析时间。
  6. 无状态性:JWT的无状态特性简化了服务端架构,但也意味着每次验证都要解析JWT,可能影响性能,尤其是在频繁验证的场景下。

弊端:

  1. 不可撤销性:JWT一旦签发,除非设置很短的有效期,否则一旦泄露,很难立即阻止其访问权限,不像传统的session可以在服务器端立即失效。
  2. 令牌管理:长生命周期的JWT可能需要引入刷新令牌机制,这增加了实现的复杂度,同时也需要妥善处理刷新令牌的安全问题。
  3. 性能影响:JWT的验证需要进行签名验证,对于大流量应用,频繁的JWT验证可能会成为性能瓶颈,尤其是当JWT包含大量声明时。
  4. 信息泄露风险:JWT的payload是Base64编码的,虽然不是直接可读,但容易解码。如果JWT包含敏感信息,可能增加信息泄露的风险。
  5. 扩展性挑战:在分布式系统中,所有节点都需要能够验证JWT,这意味着密钥需要同步,或者采用公钥/私钥对的方案,增加了运维的复杂度。

----->>>>>>JWT 身份认证优缺点分析,为什么可以有效避免了 CSRF 攻击?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/860619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研数学|张宇和武忠祥,强化能不能同时跟?

可以说你跟武老师学明白了&#xff0c;120完全没问题&#xff01;如果追求更高&#xff0c;宇哥的怀抱也想你敞开&#xff01; 学长我21年一战数学83&#xff0c;总分没过线&#xff0c;22年二战143&#xff0c;逆袭上岸211&#xff01;市面上的老师我基本都听过&#xff0c;最…

微深节能 料场堆取料无人操作系统 格雷母线

格雷母线高精度位移检测系统在料场堆取料中的应用是一个重要的技术进步&#xff0c;它极大地提升了堆取料作业的自动化和精确性。 一、格雷母线定位系统概述 格雷母线高精度位移测量系统&#xff0c;包括格雷母线、天线箱、地址解码器、地址编码器四个部分组成。 格雷母线类似一…

Java养老护理助浴陪诊小程序APP源码

&#x1f496;护理助浴陪诊小程序&#x1f496; 一、引言&#xff1a;养老新趋势&#x1f331; 在快节奏的现代生活中&#xff0c;养老问题逐渐成为了社会关注的焦点。如何为老年人提供便捷、贴心的服务&#xff0c;让他们晚年生活更加安心、舒适&#xff0c;是我们每个人都需…

篮球联盟管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;球员管理&#xff0c;用户管理&#xff0c;球队管理&#xff0c;论坛管理&#xff0c;篮球资讯管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0…

Transformer常见面试题

目录 1.Transformer为何使用多头注意力机制&#xff1f;&#xff08;为什么不使用一个头&#xff09; 2.Transformer为什么Q和K使用不同的权重矩阵生成&#xff0c;为何不能使用同一个值进行自身的点乘&#xff1f; &#xff08;注意和第一个问题的区别&#xff09; 3.Transf…

git提交新仓库代码,提示无权限,但用户名已修改

目录 1 用户名无权限 2 删除用户凭据 2.1 打开控制面板 2.2 找到“凭据管理器” 2.3 删除git历史 3 npm工具库添加git仓库指引 1 用户名无权限 之前因为时间的原因&#xff0c;js-tool-big-box工具库没有提交到github上去&#xff0c;今天想着往上提交一下&#xff0c;但…

Linux系统中根下的目录结构介绍

一、Linux的路径分隔符 Linux系统中使用正斜杠(/)作为路径分隔符&#xff1b;每个目录的后面都默认带有一个正斜杠&#xff08;如&#xff1a;需要进入opt目录可以分别使用【cd /opt】或【cd /opt/】&#xff09; 二、Linux根目录下各个目录结构介绍 红色标识的文件夹为Linux的…

“开源AI”到底是什么意思

开源与专有软件之间的斗争早已为人所熟知。然而&#xff0c;长期以来弥漫在软件圈的紧张关系已经渗透到了人工智能领域&#xff0c;部分原因在于没有人能在AI背景下就“开源”的真正含义达成一致。 相关阅读&#xff1a;GPT-4o通过整合文本、音频和视觉实现人性化的AI交互&…

PTP时间同步协议简介

注意&#xff0c;上图中 t1 t4 都是主机时间。 t2 t3 都是从机时间。 总延迟为 (t4 - t1) - (t3 - t2) 单边的平均延迟为 ((t4 - t1) - (t3 - t2) ) / 2&#xff0c;公式d1 两边的时钟偏差为 (((t3 t2) / 2)) - ((t4 t1) / 2) 也可以通过下面2个式子 t2 offset delay t1…

Orangepi Zero2 全志H616 的初识

目录 一、全志H616简介 1.1 为什么学&#xff1a; 1.2 学什么&#xff1a; 1.3 全志H616平台介绍&#xff1a; 二、刷机 系统启动和初始化配置 2.1 需要的工具&#xff1a; 2.2 工具安装&#xff1a; 2.3 刷机&#xff1a; 2.4 登录系统&#xff1a; 2.5 修改登录密码…

Prometheus:开源监控解决方案的力量

前言 在当今高度数字化和云原生应用的时代&#xff0c;监控系统是确保系统稳定性和性能的关键组成部分。而 Prometheus 作为一种开源的监控解决方案&#xff0c;正在成为越来越多企业和开发者的首选。本文将深入探讨 Prometheus 的特性、优势以及如何利用它来构建强大的监控系…

CLion2024 for Mac[po] C和C++的跨平台解代码编辑器

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

Live Wallpaper Themes 4K Pro for Mac v19.9 超高清4K动态壁纸

Live Wallpaper & Themes 4K Pro for Mac v19.7 是一款专为Mac用户设计的超高清4K动态壁纸应用程序。它凭借出色的视觉效果和丰富的个性化设置&#xff0c;为用户带来全新的桌面体验。 这款软件提供了大量精美的动态壁纸供用户选择&#xff0c;涵盖了各种风格和主题&#…

2-16 基于matlab的动载荷简支梁模态分析程序

基于matlab的动载荷简支梁模态分析程序&#xff0c;可调节简支梁参数&#xff0c;包括截面宽、截面高、梁长度、截面惯性矩、弹性模量、密度。输出前四阶固有频率&#xff0c;任意时刻、位置的响应结果。程序已调通&#xff0c;可直接运行。 2-16 matlab 动载荷简支梁模态分析 …

原生js实现图片预览控件,支持丝滑拖拽,滚轮放缩,放缩聚焦

手撸源代码如下&#xff1a;注释应该很详细了&#xff0c;拿去直用 可以放到在线编辑器测试&#xff0c;记得修改图片路径 菜鸟教程在线编辑器 <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" conten…

机器学习--KNN算法

目录 一、实验目的 二、实验的软、硬件平台 三、实验内容概述 四、实验设计方案 五、实验内容 一、实验目的 通过本实验掌握kNN算法的原理&#xff0c;熟悉kNN算法。 二、实验的软、硬件平台 python 3.6.5 CourseGrading在线实验环境 三、实验内容概述 1.kNN算法简介…

Android开发系列(九)Jetpack Compose之ConstraintLayout

ConstraintLayout是一个用于构建复杂布局的组件。它通过将子视图限制在给定的约束条件下来定位和排列视图。 使用ConstraintLayout&#xff0c;您可以通过定义视图之间的约束关系来指定它们的位置。这些约束可以是水平和垂直的对齐、边距、宽度和高度等。这允许您创建灵活而响…

⭐最新版!SpringBoot正确集成PageHelper姿势,不再被误导!

GGBond&#x1f508; CSDN的朋友们大家好哇&#xff0c;我是新来的Java练习生 CodeCodeBond&#xff01; 什么是PageHelper&#xff1f; 这里给不知道的人儿说明一下~~ 知道的xdm可以跳过了&#xff01; PageHelper顾名思义是一个 页面 帮手。也就是分页查询的一个好用的工具…

进阶篇08——MySQL管理

系统数据库 常用工具 mysql 客户端工具 mysqladmin 执行管理操作 mysqlbinlog 数据库二进制日志转成文本 mysqlshow 数据库查找 mysqldump 数据库备份 mysqlimport/source 数据库导入

vue3前后端开发:响应式对象不能直接成为前后端数据传输的对象

如图所示&#xff1a;前端控制台打印显示数据是没问题的&#xff0c;后端却显示没有接收到相应数据&#xff0c;但是后端的确接收到了一组空数据 直接说原因&#xff1a;这种情况唯一的原因是没有按正确格式传递参数。每个人写错的格式各有不同&#xff0c;我只是说明一下我在…