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

Java?JWT實現(xiàn)跨域身份驗證方法詳解

 更新時間:2022年01月08日 08:54:35   作者:別團等shy哥發(fā)育  
JWT(JSON?Web?Token)是目前流行的跨域認證解決方案,是一個開放標準(RFC?7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。本文將介紹JWT如何實現(xiàn)跨域身份驗證,感興趣的可以學習一下

1、JWT簡介

JWT(JSON Web Token)是目前流行的跨域認證解決方案,是一個開放標準(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。該信息可以被驗證和信任,因為它是數(shù)字簽名的。

2、JWT的結(jié)構(gòu)

JWT是由頭部(header)、載荷(payload)、簽證(signature)三段信息構(gòu)成的,將三段信息文本用"."連接在一起就構(gòu)成了JWT字符串。

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

使用在線校驗工具(https://jwt.io/)將上述Token進行解碼就可以看到數(shù)據(jù),如下圖所示

2.1 頭部(header)

JWT的頭部承載兩部分信息:

(1)聲明類型:這里主要是JWT。

(2)聲明加密算法:通常直接使用HMAC SHA256。

例如:

{
  "alg": "HS256",
  "typ": "JWT"
}

alg屬性表示簽名所使用的算法;

JWT簽名默認的算法為HMAC SHA256;

alg屬性值HS256就是HMAC SHA256算法;

type屬性表示令牌類型,這里是JWT。

2.2 載荷(payload)

載荷是JWT的主體,同樣也是一個JSON對象。載荷包含三個部分:

(1)標準中的聲明(Registered Claims):一組預定義的聲明,不是強制的,但是推薦。

  • iss(issuer):JWT簽發(fā)者
  • sub(subject):JWT索所面向的用戶
  • aud(audience):接收JWT的一方
  • exp(expiration):JWT的過期時間,必須要大于簽發(fā)時間。
  • nbf(not before):定義了再什么時間之前該JWT都是不可用的。
  • iat(issued at):JWT的發(fā)布時間,UNIX時間戳。
  • jti(JWT ID):JWT的唯一ID編號。

(2)公共的聲明:可以添加任意信息,一般添加用戶的相關(guān)信息或其他業(yè)務需要的必要信息,但不建議添加敏感信息。

(3)私有的聲明:提供者和消費者所共同定義的聲明,一般不建議存放敏感信息。

2.3 簽證(signature)

JWT的第三部分是一個簽證信息,由三部分組成:header(base64后的)、payload(base64后的)、secret(密鑰,需要保存好)。

例如:

HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

簽名用于驗證消息再傳遞過程中有沒有被更改,并且對于使用私鑰簽名的Token還可以驗證JWT的發(fā)送方是否為它所說的發(fā)送方。

secret是保存在服務端的,JWT的簽發(fā)生成也是在服務端的,secret就是用來進行JWT的簽發(fā)和驗證的,所以secret是服務端的私鑰,在任何場景都不應該流露出去。

3、JWT的原則

JWT的原則是在服務器身份驗證之后,將生成一個JSON對象并將其發(fā)送回用戶,如下所示。

{
  "sub": "1234567890",
  "name": "Helen",
  "admin": true
}

之后,當用戶與服務器通信時,客戶在請求中發(fā)回JSON對象。服務器僅依賴于這個JSON對象來標識用戶。為了防止用戶篡改數(shù)據(jù),服務器將在生成對象時添加簽名。

服務器不保存任何會話數(shù)據(jù),即服務器變?yōu)闊o狀態(tài),使其更容易擴展。

4、JWT的用法

客戶端接收服務器返回的JWT,將其存儲在Cookie或localStorage中。

此后,客戶端將在與服務器交互中都會帶JWT。如果將它存儲在Cookie中,就可以自動發(fā)送,但是不會跨域,因此一般是將它放入HTTP請求的Header Authorization字段中。當跨域時,也可以將JWT被放置于POST請求的數(shù)據(jù)主體中。

5、JWT的問題和趨勢

JWT不僅可用于認證,還可用于信息交換。善用JWT有助于減少服務器請求數(shù)據(jù)庫的次數(shù)。

生產(chǎn)的token可以包含基本信息,比如id、用戶昵稱、頭像等信息,避免再次查庫

存儲在客戶端,不占用服務端的內(nèi)存資源

JWT默認不加密,但可以加密。生成原始令牌后,可以再次對其進行加密。

當JWT未加密時,一些私密數(shù)據(jù)無法通過JWT傳輸。

JWT的最大缺點是服務器不保存會話狀態(tài),所以在使用期間不可能取消令牌或更改令牌的權(quán)限。也就是說,一旦JWT簽發(fā),在有效期內(nèi)將會一直有效。

JWT本身包含認證信息,token是經(jīng)過base64編碼,所以可以解碼,因此token加密前的對象不應該包含敏感信息,一旦信息泄露,任何人都可以獲得令牌的所有權(quán)限。為了減少盜用,JWT的有效期不宜設置太長。對于某些重要操作,用戶在使用時應該每次都進行進行身份驗證。

為了減少盜用和竊取,JWT不建議使用HTTP協(xié)議來傳輸代碼,而是使用加密的HTTPS協(xié)議進行傳輸。

6、整合JWT令牌

6.1 在模塊中添加jwt工具依賴

<dependencies>
    <!-- JWT-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    </dependency>
</dependencies>

6.2 創(chuàng)建JWT工具類

/**
 * JWT工具類
 */
public class JwtHelper {
    //過期時間
    private static long tokenExpiration = 24*60*60*1000;
    //token簽名密鑰
    private static String tokenSignKey = "123456";

    //根據(jù)參數(shù)生成token
    public static String createToken(Long userId, String userName) {
        String token = Jwts.builder()
                .setSubject("YYGH-USER")
                //設置過期時間 30分鐘
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
                //設置主題信息  用戶id和用戶名稱
                .claim("userId", userId)
                .claim("userName", userName)
                //簽名哈希
                .signWith(SignatureAlgorithm.HS512, tokenSignKey)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }
    //根據(jù)token字符串得到用戶id
    public static Long getUserId(String token) {
        if(StringUtils.isEmpty(token)) return null;
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        Integer userId = (Integer)claims.get("userId");
        return userId.longValue();
    }
    //根據(jù)token字符串得到用戶名稱
    public static String getUserName(String token) {
        if(StringUtils.isEmpty(token)) return "";
        Jws<Claims> claimsJws 
            = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return (String)claims.get("userName");
    }
   
}

寫個主函數(shù)測試下:

public static void main(String[] args) {
        String token = JwtHelper.createToken(1L, "lucy");
        System.out.println(token);
        System.out.println(JwtHelper.getUserId(token));
        System.out.println(JwtHelper.getUserName(token));
    }

簽發(fā)和解析都沒問題。

到此這篇關(guān)于Java JWT實現(xiàn)跨域身份驗證方法詳解的文章就介紹到這了,更多相關(guān)JWT跨域身份驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JSON.toJSONString()空字段不忽略修改的問題

    JSON.toJSONString()空字段不忽略修改的問題

    這篇文章主要介紹了JSON.toJSONString()空字段不忽略修改的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 如何使用spring ResponseEntity處理http響應

    如何使用spring ResponseEntity處理http響應

    這篇文章主要介紹了如何使用spring ResponseEntity處理http響應的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Springboot使用Security實現(xiàn)OAuth2授權(quán)驗證完整過程

    Springboot使用Security實現(xiàn)OAuth2授權(quán)驗證完整過程

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot使用Security實現(xiàn)OAuth2授權(quán)驗證完整過程
    2022-12-12
  • Java的List集合框架之Vector詳細解析

    Java的List集合框架之Vector詳細解析

    這篇文章主要介紹了Java的List集合框架之Vector詳細解析,List接口繼承Collection,Collection繼承于Iterable,List接口實現(xiàn)類分為Vector、ArrayList、LinkedList,Vector底層是一個Object數(shù)組,需要的朋友可以參考下
    2023-11-11
  • Java 通過JDBC連接Mysql數(shù)據(jù)庫

    Java 通過JDBC連接Mysql數(shù)據(jù)庫

    本文給大家詳細介紹了java如何使用JDBC連接Mysql的方法以及驅(qū)動包的安裝,最后給大家附上了java通過JDBC連接其他各種數(shù)據(jù)庫的方法,有需要的小伙伴可以參考下。
    2015-11-11
  • SpringBoot集成thymeleaf瀏覽器404的解決方案

    SpringBoot集成thymeleaf瀏覽器404的解決方案

    前后端不分離的古早 SpringMVC 項目通常會使用 thymeleaf 模板引擎來完成 html 頁面與后端接口之間的交互,如果要將項目架構(gòu)升級成 SpringBoot , thymeleaf 也可以照常集成,但有時候會踩到一些坑,所以本文給大家介紹了SpringBoot集成thymeleaf瀏覽器404的解決方案
    2024-12-12
  • Java封裝統(tǒng)一的Result Model案例

    Java封裝統(tǒng)一的Result Model案例

    這篇文章主要介紹了Java封裝統(tǒng)一的Result Model案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring Cloud Stream整合RocketMQ的搭建方法

    Spring Cloud Stream整合RocketMQ的搭建方法

    本文介紹了如何使用SpringCloudStream整合RocketMQ進行消息傳遞,SpringCloudStream是一個用于構(gòu)建與共享消息系統(tǒng)連接的框架,支持持久pub/sub語義和消費者組,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 淺談java switch如果case后面沒有break,會出現(xiàn)什么情況?

    淺談java switch如果case后面沒有break,會出現(xiàn)什么情況?

    這篇文章主要介紹了淺談java switch如果case后面沒有break,會出現(xiàn)什么情況?具有很好的參考價值,希望對大家有所幫助。一起跟隨想小編過來看看吧
    2020-09-09
  • Spring框架SSM之IOC詳解

    Spring框架SSM之IOC詳解

    本文介紹了Spring框架中IOC(控制反轉(zhuǎn)/依賴注入)的兩種實現(xiàn)方式,每種方式結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-11-11

最新評論

商丘市| 阳春市| 静安区| 通辽市| 锡林浩特市| 仪陇县| 杭锦后旗| 抚宁县| 信丰县| 康乐县| 南靖县| 新宾| 滁州市| 肥西县| 平罗县| 昌都县| 鹤庆县| 武冈市| 托里县| 墨竹工卡县| 怀仁县| 顺昌县| 昌吉市| 江都市| 巴青县| 上高县| 育儿| 河南省| 仙游县| 和平县| 梨树县| 通河县| 玉树县| 游戏| 区。| 长汀县| 云林县| 敖汉旗| 六盘水市| 蓬安县| 武强县|