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/zh-hk/n/333229.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IQUWS的頭像IQUWS
上一篇 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

發表回復

登錄後才能評論