基于 JWT 进行身份验证

news2024/11/18 15:38:19

一、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);

    // 生成JWT
    public 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);
    }

    // 解析JWT
    public 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.coloradmin.cn/o/1864067.html

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

相关文章

【系统架构师】-收官整理-已考过

目录 1、在2023年11月第一次考试 2、在2024年5月第二次考试 3、备考过程 3.1、综合知识 3.2、案例分析 3.3、论文 我是从2023年8月开始备考架构师考试&#xff0c;一边工作&#xff0c;一遍抽空学习&#xff08;并没有参加培训&#xff09;。 1、在2023年11月第一次考试…

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法

问题描述&#xff1a;word2016中新建页面显示出来的页面没有页眉页脚&#xff0c;只显示正文部分。设置了页边距也不管用。 如图1 图1 解决&#xff1a; 点击“视图”——“多页”——“单页”&#xff0c;即可。如图2操作 图2 结果展示&#xff1a;如图3 图3

Springboot小型仪器公司生产管理系统-计算机毕业设计源码031853

摘 要 本论文主要论述了如何使用java语言开发一个Springboot小型仪器公司生产管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述小型仪器公司生产管理系统…

SV std::randomize使用技巧与指南

通过以下例子学习&#xff1a; 其它&#xff1a; 里面夹杂&#xff1a; if(en1) { ((a>b)&&(b>c) || (e>f)&&(j>k)); } else { }

如何提高搜索点击率:五个利用ChatGPT创造吸引眼球标题的小技巧

在当今信息爆炸的时代&#xff0c;如何让自己的文章在海量信息中脱颖而出&#xff0c;是每个内容创作者都在思考的问题。尤其是当读者面对无数个搜索结果时&#xff0c;标题成为吸引他们点击的第一步。那么&#xff0c;如何才能写出吸引眼球的标题&#xff0c;从而提高搜索点击…

星戈瑞DSPE-FITC在细胞标记中的应用

细胞标记是生物医学研究中的一项基本技术&#xff0c;它允许研究者追踪和观察细胞的行为、分布以及与周围环境的相互作用。在众多的细胞标记方法中&#xff0c;DSPE-FITC因其独特的性质和应用范围而受关注。 DSPE-FITC的基本性质 DSPE-FITC是由二硬脂酰磷脂酰乙醇胺&#xff0…

【消息队列】RabbitMQ集群原理与搭建

目录 前言1、集群搭建1.1、安装RabbitMQ1.1.1、前置要求1.1.2、安装Erlang环境①创建yum库配置文件②加入配置内容③更新yum库④正式安装Erlang 1.1.3、安装RabbitMQ1.1.4、RabbitMQ基础配置1.1.5、收尾工作 1.2、克隆VMWare虚拟机1.2.1、目标1.2.2、克隆虚拟机1.2.3、给新机设…

Mybatis 到 MyBatisPlus

Mybatis 到 MyBatisPlus Mybatis MyBatis&#xff08;官网&#xff1a;https://mybatis.org/mybatis-3/zh/index.html &#xff09;是一款优秀的 持久层 &#xff08;ORM&#xff09;框架&#xff0c;用于简化JDBC的开发。是 Apache的一个开源项目iBatis&#xff0c;2010年这…

vscode关于java扩展

包含IDEA同款代码提示&#xff0c;vscode的debug&#xff0c;除了创建类要手动新建java文件以外&#xff0c;其他都还行&#xff0c;满足初学者要求。

免费插件集-illustrator插件-Ai插件-测量路径周长

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行测量路径周长处理。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&…

【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解

最终效果 文章目录 最终效果前言存储位置信息存储更多数据存储场景信息持久化存储数据 前言 前面写过小型游戏存储功能&#xff1a; 【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解&#xff08;包含数据安全处理方案的加密解密&#xff09; 这次做一个针…

HarmonyOS应用开发学习经验

一、HarmonyOS学习官网 开发者能力认证 HarmonyOS应用开发者基础认证6月之前的学习资源官网已经关闭过期&#xff0c;大家不要慌&#xff0c;官方更新了最新资源&#xff0c;但是&#xff0c;对于之前没有学习完的学员不友好&#xff0c;存在知识断片的现象&#xff0c;建议官…

小程序中this(1)

}, onLoad: function() {}, }) 此时经过编译后模拟器的显示&#xff1a; 这里都容易理解&#xff0c;当点击了button按钮后&#xff0c;触发点击事件执行testfun函数&#xff0c;将test02设置为8&#xff0c;如图&#xff1a; 通过this.data.test028这种方式直接赋值可以吗&…

音乐创作与制作软件:Studio One 6.6.1中文版安装激活使用指南

音乐创作与制作软件&#xff1a;Studio One 6.6.1 简介 StudioOne 的设计核心是易于使用。十年来&#xff0c;它已将久经考验的录音棚模型与当今以节拍和循环为导向的制作过程无缝地结合在一起&#xff0c;因此您可以比以往更快地将音乐创意带入声音现实。高效的单屏幕界面可…

酷开系统丨酷开科技AI赋能数字大屏,开启智能家居新纪元

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的崛起无疑为科技领域带来了革命性的变化。酷开科技&#xff0c;正以其独特的"AI数字大屏"战略&#xff0c;将创新理念转化为现实&#xff0c;引领行业发展新潮流。 酷开科技的智能电视操作系统…

芯片设计公司供应链软件管理包括哪些内容

芯片设计公司的供应链软件管理是一个复杂而精细的过程&#xff0c;它涵盖了从原材料采购到最终产品交付的各个环节。以下是关于芯片设计公司供应链软件管理内容的科普介绍。 首先&#xff0c;供应链软件管理的起点是原材料采购。这部分内容主要关注确保供应商提供高质量、符合设…

【C++】相机标定源码笔记-相机内参标定类

相机内参标定类 该代码是一个关于摄像头内参处理类的实现。它主要做了以下几件事情&#xff1a; 1. 提供读取和保存相机内参的功能。 2. 允许用户设置一系列参数&#xff08;如图像尺寸、棋盘格尺寸等&#xff09;。 3. 支持从图像中检测棋盘格角点&#xff0c;并根据检测到的角…

每台电脑的ip地址是随机改动的吗

在数字化快速发展的今天&#xff0c;互联网已成为我们生活和工作的重要组成部分。当我们使用电脑上网时&#xff0c;IP地址作为电脑在网络中的唯一标识&#xff0c;起到了至关重要的作用。然而&#xff0c;很多人对于IP地址的分配和变化存在疑问&#xff0c;尤其是关于每台电脑…

上涨至13.6分!当之无愧的顶级期刊,影响因子“狂飙”,门槛较低,2个月可录!

本期解析 1、2024年6月20日&#xff0c;科睿唯安正式公布2024年度《期刊引证报告》。 2、本次主要解析Elsevier旗下一本TOP顶刊&#xff0c;期刊表现优秀&#xff0c;在最新的影响因子更新中由12.8上涨至13.6&#xff0c;是一本妥妥评职高分宝刊&#xff01;接下来看看它是否…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中&#xff0c;我们通过系统思考仿真演练深入探索决策背后的动因。例如&#xff0c;我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”&#xff0c;这些都是麻省理工MBA学生的必修课。此外&#xff0c;还有更简洁的“红黑游戏”“收获季节”等模拟…