JWT工具类详解

一、JWT简介

JWT全称为Json Web Token(JSON Web Token),主要用于网络上信息的传输,也可以用于其他场合。JWT由3部分组成,分别是头部(header)、载荷(payload)和签名(signature)。头部和载荷都是JSON格式的信息,签名是用于验证数据完整性的一串字符。使用JWT可以有效地避免在传输过程中被篡改的风险,同时也可以提高网络传输效率。

二、JWT工具类的实现原理

JWT工具类通过封装实现了jwt的生成和验证。一个JWT实际上由3部分组成,即头部、载荷和签名,而这3部分都是由Base64编码后的JSON字符串。首先,我们需要指定签名的算法和密钥。对于头部和载荷部分,我们需要指定信息类型及传输的数据。具体而言,我们需要 RFC7519 规范中的一个例子:

{
  "alg": "HS256",
  "typ": "JWT"
}
{
  "sub": "1234567890",
  "name": "Peter Smith",
  "iat": 1516239022
}

上面是一个头部和载荷都包含的例子。在生成JWT时,我们需要通过指定这些信息和密钥来生成签名,并将签名拼接到头部和载荷后形成一个完整的JWT内容。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;

public class JwtUtil {

    private static final long EXPIRATION_TIME = 3600_000; // 1小时
    private static final Key SECRET = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    /**
     * 生成JWT
     *
     * @param subject 认证主体
     * @return JWT
     */
    public static String generateToken(String subject) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setIssuer("JwtUtil")
                .setSubject(subject)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SECRET)
                .compact();
    }

    /**
     * 解析JWT
     *
     * @param jwt JWT内容
     * @return 令牌声明
     */
    public static Claims parseToken(String jwt) {
        if (jwt == null) {
            return null;
        }

        String[] parts = jwt.split("\\.");
        if (parts.length != 3) {
            return null;
        }

        byte[] bytes = Base64.decodeBase64(parts[0]);
        String headerJson = new String(bytes);

        bytes = Base64.decodeBase64(parts[1]);
        String payloadJson = new String(bytes);

        byte[] signature = Base64.decodeBase64(parts[2]);

        Jws jwtClaims = Jwts.parserBuilder()
                .setSigningKey(SECRET)
                .build()
                .parseClaimsJws(jwt);

        return jwtClaims.getBody();
    }
}

三、JWT工具类的应用示例

使用JWT工具类生成和解析一条JWT内容非常简单。首先,我们需要调用生成令牌的方法,传入认证主体的信息即可。比如,以下代码生成了一个认证主体为”johndoe”的JWT:

String jwt = JwtUtil.generateToken("johndoe");

生成的JWT如下:

eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJKd3RVbHQiLCJzdWIiOiJqb2huZG9lIiwiaWF0IjoxNjE2NDM1NDk2LCJleHAiOjE2MTY0Mzk0OTZ9.97WXEWl-9v_9-mMpJlav8Qoyx5lEhrnbZm8F5ZkT9uA

其间包含头部、载荷和签名三部分。

接着,我们可以使用JWT工具类的解析方法将JWT解析成认证主体内容。比如,以下代码将jwt解析为Claims:

Claims claims = JwtUtil.parseToken(jwt);

解析后的结果如下:

{
  "iss": "JwtUtil",
  "sub": "johndoe",
  "iat": 1616435496,
  "exp": 1616439496
}

四、JWT工具类的优缺点

优点

JWT工具类的优点主要包括以下几个方面:

1. 简化处理

JWT工具类封装了JWT的生成和解析过程,使得使用者可以不必了解JWT的细节就可以轻松实现JWT功能。

2. 安全性高

JWT工具类实现了签名的生成和验证过程,通过指定签名算法和密钥可以有效地避免信息在传输过程中被篡改的风险,保证了信息传输的安全性。

缺点

JWT工具类的缺点主要体现在以下几个方面:

1. 客户端存储问题

由于JWT是无状态的,因此在认证过程中需要将所有的信息都包含在JWT中,这就使得JWT变得较为臃肿。同时,JWT也需要被存储于客户端,如果存储在cookie中,就容易受到 CSRF(跨站请求伪造)的攻击;而如果存储在localStorage中,则容易受到 XSS(跨站脚本攻击)的攻击。

2. 无效验证问题

由于JWT是无状态的,一旦签发后,就无法使其失效。即使将JWT存储在数据库或者Redis中,也只能通过删除来使其失效,而这样往往需要对数据库或者Redis进行频繁的访问和更新,影响系统的效率。

五、总结

JWT工具类是实现JWT功能的重要工具。通过对JWT工具类的详细阐述,我们可以了解到JWT的实现原理和如何应用于具体场景。同时,我们也需要注意到JWT工具类的优缺点,避免在使用JWT工具类时出现问题。

原创文章,作者:IQUWS,如若转载,请注明出处:https://www.506064.com/n/333229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IQUWSIQUWS
上一篇 2025-01-27 13:35
下一篇 2025-01-27 13:35

相关推荐

  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • 如何通过jstack工具列出假死的java进程

    假死的java进程是指在运行过程中出现了某些问题导致进程停止响应,此时无法通过正常的方式关闭或者重启该进程。在这种情况下,我们可以借助jstack工具来获取该进程的进程号和线程号,…

    编程 2025-04-29
  • 注册表取证工具有哪些

    注册表取证是数字取证的重要分支,主要是获取计算机系统中的注册表信息,进而分析痕迹,获取重要证据。本文将以注册表取证工具为中心,从多个方面进行详细阐述。 一、注册表取证工具概述 注册…

    编程 2025-04-29
  • JWT验证Token的实现

    本文将从以下几个方面对JWT验证Token进行详细的阐述,包括:JWT概述、JWT验证Token的意义、JWT验证Token的过程、JWT验证Token的代码实现、JWT验证Tok…

    编程 2025-04-29
  • Python运维工具用法介绍

    本文将从多个方面介绍Python在运维工具中的应用,包括但不限于日志分析、自动化测试、批量处理、监控等方面的内容,希望能对Python运维工具的使用有所帮助。 一、日志分析 在运维…

    编程 2025-04-28
  • t3.js:一个全能的JavaScript动态文本替换工具

    t3.js是一个非常流行的JavaScript动态文本替换工具,它是一个轻量级库,能够很容易地实现文本内容的递增、递减、替换、切换以及其他各种操作。在本文中,我们将从多个方面探讨t…

    编程 2025-04-28
  • Trocket:打造高效可靠的远程控制工具

    如何使用trocket打造高效可靠的远程控制工具?本文将从以下几个方面进行详细的阐述。 一、安装和使用trocket trocket是一个基于Python实现的远程控制工具,使用时…

    编程 2025-04-28
  • gfwsq9ugn:全能编程开发工程师的必备工具

    gfwsq9ugn是一个强大的编程工具,它为全能编程开发工程师提供了一系列重要的功能和特点,下面我们将从多个方面对gfwsq9ugn进行详细的阐述。 一、快速编写代码 gfwsq9…

    编程 2025-04-28
  • Python 编写密码安全检查工具

    本文将介绍如何使用 Python 编写一个能够检查用户输入密码安全强度的工具。 一、安全强度的定义 在实现安全检查之前,首先需要明确什么是密码的安全强度。密码的安全强度通常包括以下…

    编程 2025-04-27
  • Morphis: 更加简便、灵活的自然语言处理工具

    本文将会从以下几个方面对Morphis进行详细的阐述: 一、Morphis是什么 Morphis是一个开源的Python自然语言处理库,用于处理中心语言(目前仅支持英文)中的词性标…

    编程 2025-04-27

发表回复

登录后才能评论