最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何使用JWT實現(xiàn)Token認證機制

 更新時間:2024年10月30日 09:00:30   作者:pan_junbiao  
JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)上安全地傳輸信息的簡潔的、URL 安全的表示方法,本文主要介紹了Java如何使用JWT實現(xiàn)Token認證機制,需要的可以參考下

1、JWT 的簡述

JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)上安全地傳輸信息的簡潔的、URL 安全的表示方法,它定義了一個緊湊且自包含的方式,用于不同實體之間安全地傳輸信息(JSON格式)。以下是關(guān)于 JWT 的詳細介紹:

1.1 JWT 的組成

JWT 通常由三部分組成,分別是 Header(頭部)、Payload(有效載荷)和 Signature(簽名)。

Header(頭部):頭部通常包含兩部分信息,即聲明類型和聲明所使用的算法。聲明類型通常是 JWT,而聲明所使用的算法則可以是 HMACSHA256、RSA 等。頭部信息會進行 Base64URL 編碼,形成 JWT 的第一部分。

Payload(有效載荷):有效載荷包含了具體的用戶信息,如用戶ID、用戶名、角色等,也可以包含自定義的其他信息。這些信息以 JSON 格式進行編碼,并且同樣經(jīng)過 Base64URL 編碼,形成 JWT 的第二部分。Payload 中的聲明可以分為三類:Reserved claims(標(biāo)準(zhǔn)聲明)、Private claims(私有聲明)和Public claims(公共聲明)。

Signature(簽名):簽名是 JWT 的第三部分,它使用 Header 和 Payload 中的數(shù)據(jù)以及一個密鑰來生成。簽名的目的是保證消息沒有被篡改,并且只能被服務(wù)器端識別和驗證。簽名也是通過特定的算法(如HMACSHA256)生成的,并會附加到JWT的末尾。

1.2 JWT 的工作原理

在用戶登錄后,系統(tǒng)會生成一個 JWT 返回給用戶。用戶的每次請求都會攜帶這個 JWT,通常將其放在 HTTP 請求的頭部(如Authorization頭部,使用Bearer模式)。服務(wù)器在接收到請求后,會驗證 JWT 的簽名以確認其完整性和來源,并根據(jù) JWT 中的信息來認證用戶或授權(quán)用戶對資源的訪問。

1.3 JWT 的優(yōu)點

簡潔和緊湊:JWT 是一個字符串,不占空間,傳輸速度快。

自包含:JWT 包含了用戶信息和簽名,服務(wù)器端不需要再查詢數(shù)據(jù)庫或其他存儲來獲取用戶信息,實現(xiàn)了去中心化的驗證。

跨語言支持:由于 JWT 是基于標(biāo)準(zhǔn)的 JSON 格式和 Base64URL 編碼實現(xiàn)的,因此它可以在不同的平臺和語言之間進行傳輸和解析。

安全性:在生成 JWT 簽名時使用了加密算法,保證了 JWT 數(shù)據(jù)的安全性和完整性。然而,需要注意的是,JWT 本身不提供端到端的加密,因此不應(yīng)存儲敏感信息(如密碼)。為了提高安全性,可以使用 JSON Web Encryption(JWE)對 JWT 進行加密。

1.4 JWT 的應(yīng)用場景

JWT 廣泛應(yīng)用于現(xiàn)代 Web 應(yīng)用程序中,特別是在身份驗證和授權(quán)方面。以下是一些常見的應(yīng)用場景:

單點登錄:JWT 可以用于實現(xiàn)單點登錄功能,用戶只需登錄一次即可在不同的系統(tǒng)或應(yīng)用之間無縫切換。

跨域身份驗證:JWT 可以在不同的域或子域之間傳輸用戶身份信息,實現(xiàn)跨域的身份驗證。

API安全認證:JWT 可以用于 API 的安全認證,確保只有合法的用戶才能訪問受保護的資源。

1.5 JWT 的安全性注意事項

盡管 JWT 提供了一些安全性,但其安全性也取決于如何使用和實現(xiàn)它。以下是一些關(guān)于 JWT 安全性的注意事項:

始終使用 HTTPS 協(xié)議:為了確保 JWT 在傳輸過程中的安全性,應(yīng)始終使用 HTTPS 協(xié)議來傳輸 JWT。這有助于防止中間人攻擊和竊聽。

正確存儲 JWT:在客戶端,最常見的 JWT 存儲方法是使用 cookie 或 localStorage。cookie 相對更安全,尤其是使用 HttpOnly 和 Secure 標(biāo)志時。HttpOnly 標(biāo)志可以防止 JavaScript 訪問 cookie,降低了跨站腳本(XSS)攻擊的風(fēng)險;而 Secure 標(biāo)志則確保 cookie 僅通過 HTTPS 傳輸,降低了中間人攻擊的風(fēng)險。

設(shè)置合理的有效期:JWT 的有效期應(yīng)盡可能短,以減少攻擊者利用竊取的令牌的時間。通常,JWT 應(yīng)具有較短的生存時間(如15分鐘),并使用刷新令牌在需要時更新。

避免在 JWT 中存儲敏感信息:由于 JWT 在客戶端和服務(wù)器之間傳輸時可能會被攔截或篡改,因此應(yīng)避免在 JWT 中存儲敏感信息(如密碼)。如果需要傳輸敏感信息,請使用加密方法(如JWE)對JWT進行加密。

2、JWT 實現(xiàn) Token 認證機制

【示例】使用 JWT 生成 Token 與 驗證 Token。 

(1)添加 Maven 依賴

在項目的 pom.xml 配置文件中添加 JWT 依賴。

<!-- JWT 依賴 -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>

(2)創(chuàng)建工具類

 在 util 目錄下,創(chuàng)建 JwtUtil 類(JWT 工具類)。

package com.pjb.util;
 
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
 
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
 
/**
 * JWT 工具類
 * @author pan_junbiao
 **/
public class JwtUtil
{
    //密鑰
    private final static String SECRET_KEY = "123456789";
 
    /**
     * 創(chuàng)建 JWT 令牌
     */
    public static String createToken(Map<String, Object> payloadClaims)
    {
        //創(chuàng)建 Header(頭部)內(nèi)容
        HashMap<String, Object> headerMap = new HashMap<>();
 
        //令牌過期時間
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND, 60); //60秒
 
        //生成 JWT 令牌
        String token = JWT.create()
                .withExpiresAt(instance.getTime())     //設(shè)置令牌過期時間
                .withHeader(headerMap)                 //設(shè)置 Header(頭部)
                .withPayload(payloadClaims)            //設(shè)置 Payload(載荷)
                .sign(Algorithm.HMAC256(SECRET_KEY));  //設(shè)置 Signature(簽名)
 
        //返回結(jié)果
        return token;
    }
 
    /**
     * 驗證 JWT 令牌
     */
    public static DecodedJWT verifierToken(String jwtToken)
    {
        try
        {
            //創(chuàng)建驗證對象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET_KEY)).build();
 
            //驗證令牌
            DecodedJWT decodedJWT = jwtVerifier.verify(jwtToken);
 
            //返回結(jié)果
            return decodedJWT;
        } catch (SignatureVerificationException ex)
        {
            System.out.println("無效的簽名");
            ex.printStackTrace();
        } catch (TokenExpiredException ex)
        {
            System.out.println("Token已過期");
            ex.printStackTrace();
        } catch (AlgorithmMismatchException ex)
        {
            System.out.println("驗證的算法不一致");
            ex.printStackTrace();
        } catch (Exception ex)
        {
            System.out.println("Token驗證發(fā)生異常");
            ex.printStackTrace();
        }
        return null;
    }
}

(3)執(zhí)行方法

使用 JWT 生成 Token 與 驗證 Token。

/**
 * 使用 JWT 實現(xiàn) Token 認證機制
 */
@Test
public void testJwtToken()
{
    //創(chuàng)建數(shù)據(jù)(Payload 載荷)
    Map<String, Object> payloadClaims = new HashMap<>();
    payloadClaims.put("userId",1);
    payloadClaims.put("userName","pan_junbiao的博客");
    payloadClaims.put("blogInfo","您好,歡迎訪問 pan_junbiao的博客");
    payloadClaims.put("blogUrl","https://blog.csdn.net/pan_junbiao");
 
    // 1、創(chuàng)建 JWT 令牌
    String token = JwtUtil.createToken(payloadClaims);
 
    // 2、驗證 JWT 令牌
    DecodedJWT decodedJWT = JwtUtil.verifierToken(token);
    if(decodedJWT == null)
    {
        System.out.println("驗證 JWT 令牌失敗");
        return;
    }
 
    //打印結(jié)果
    System.out.println("生成Token:" + token);
    System.out.println("驗證Token:" + (decodedJWT != null));
    System.out.println("Token過期時間:" + decodedJWT.getExpiresAtAsInstant());
    System.out.println("用戶編號:" + decodedJWT.getClaim("userId").asInt());
    System.out.println("用戶名稱:" + decodedJWT.getClaim("userName").asString());
    System.out.println("博客信息:" + decodedJWT.getClaim("blogInfo").asString());
    System.out.println("博客地址:" + decodedJWT.getClaim("blogUrl").asString());
}

執(zhí)行結(jié)果:

以上就是Java如何使用JWT實現(xiàn)Token認證機制的詳細內(nèi)容,更多關(guān)于Java JWT實現(xiàn)Token認證的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java OOM 異常場景與排查過程(堆、棧、方法區(qū))

    Java OOM 異常場景與排查過程(堆、棧、方法區(qū))

    這篇文章主要介紹了Java OOM 異常場景與排查過程(堆、棧、方法區(qū)),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot返回html界面的使用示例

    SpringBoot返回html界面的使用示例

    本文主要介紹了SpringBoot返回html界面的使用示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • spring boot整合shiro安全框架過程解析

    spring boot整合shiro安全框架過程解析

    這篇文章主要介紹了spring boot整合shiro安全框架過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Java并發(fā)編程之ConcurrentLinkedQueue隊列詳情

    Java并發(fā)編程之ConcurrentLinkedQueue隊列詳情

    這篇文章主要介紹了Java并發(fā)編程之ConcurrentLinkedQueue隊列詳情,ConcurrentLinkedQueue?內(nèi)部的隊列使用單向鏈表方式實現(xiàn),下文更多相關(guān)內(nèi)容敘述需要的小伙伴可以參考一下
    2022-04-04
  • Java實現(xiàn)Promise.all()的示例代碼

    Java實現(xiàn)Promise.all()的示例代碼

    這篇文章主要介紹了Java實現(xiàn)Promise.all()的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 基于Java8 Stream API實現(xiàn)數(shù)據(jù)抽取收集

    基于Java8 Stream API實現(xiàn)數(shù)據(jù)抽取收集

    這篇文章主要介紹了基于Java8 Stream API實現(xiàn)數(shù)據(jù)抽取收集,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • spring security登錄認證授權(quán)的項目實踐

    spring security登錄認證授權(quán)的項目實踐

    SpringSecurity主要實現(xiàn)了認證(Authentication)和授權(quán)(AccessControl),本文就來介紹一下spring security登錄認證授權(quán)的項目實踐,感興趣的可以了解一下
    2025-01-01
  • Nginx啟用壓縮及開啟gzip 壓縮的方法

    Nginx啟用壓縮及開啟gzip 壓縮的方法

    這篇文章主要介紹了Nginx啟用壓縮及開啟gzip 壓縮的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • SpringCloud?LoadBalancerClient?負載均衡原理解析

    SpringCloud?LoadBalancerClient?負載均衡原理解析

    LoadBalancerClient?是?SpringCloud?提供的一種負載均衡客戶端,Ribbon?負載均衡組件內(nèi)部也是集成了?LoadBalancerClient?來實現(xiàn)負載均衡,本文給大家深入解析?LoadBalancerClient?接口源碼,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Java實現(xiàn)較大二進制文件的讀、寫方法

    Java實現(xiàn)較大二進制文件的讀、寫方法

    本篇文章主要介紹了Java實現(xiàn)較大二進制文件的讀、寫方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論

泾阳县| 余姚市| 宜阳县| 延津县| 五峰| 明光市| 宣城市| 闻喜县| 岢岚县| 和静县| 大同县| 怀化市| 饶河县| 军事| 彰化市| 临漳县| 尚义县| 怀宁县| 个旧市| 赤水市| 海盐县| 西林县| 玉屏| 扎赉特旗| 政和县| 荣昌县| 广灵县| 翼城县| 屏东县| 桐庐县| 克山县| 砚山县| 宁陕县| 南和县| 襄城县| 武安市| 合阳县| 如皋市| 且末县| 涡阳县| 兴仁县|