博客專欄

        EEPW首頁 > 博客 > JWT的數(shù)據(jù)格式詳解

        JWT的數(shù)據(jù)格式詳解

        發(fā)布人:電子禪石 時間:2024-02-23 來源:工程師 發(fā)布文章
        1.1.簡介

        JWT,全稱是Json Web Token, 是JSON風(fēng)格輕量級的授權(quán)和身份認證規(guī)范,可實現(xiàn)無狀態(tài)、分布式的Web應(yīng)用授權(quán);它是分布式服務(wù)權(quán)限控制的標(biāo)準(zhǔn)解決方案!

        官網(wǎng):https://jwt.io

        GitHub上jwt的java客戶端:https://github.com/jwtk/jjwt


        1.2.數(shù)據(jù)格式

        普通的token:32位UUID

        在這里插入圖片描述

        JWT的token:.

        在這里插入圖片描述

        JWT的token包含三部分數(shù)據(jù):


        Header:頭部,通常頭部有兩部分信息:

        聲明類型type,這里是JWT(type=jwt)

        加密算法,自定義(rs256/base64/hs256)

        我們會對頭部進行base64加密(可解密),得到第一部分數(shù)據(jù)

        Payload:載荷,就是有效數(shù)據(jù),一般包含下面信息:

        用戶身份信息-userid,username(注意,這里因為采用base64加密,可解密,

        因此不要存放敏感信息)

        注冊聲明:如token的簽發(fā)時間,過期時間,簽發(fā)人等

        這部分也會采用base64加密,得到第二部分數(shù)據(jù)

        Signature:base64加密,簽名,是整個數(shù)據(jù)的認證信息。

        一般根據(jù)前兩步的數(shù)據(jù),再加上服務(wù)的的密鑰(secret,鹽)(不要泄漏,最好周期性更換)

        ,通過加密算法生成。用于驗證整個數(shù)據(jù)完整和可靠性

        一個JWT實際上就是一個字符串,它由三部分組成,頭部、載荷與簽名。

        ————————————————

        頭部(header)

        頭部用于描述關(guān)于該JWT的最基本的信息,例如其類型以及簽名所用的算法等。這也可以 被表示成一個JSON對象。

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

        這就是頭部的明文內(nèi)容,第一部分說明他是一個jwt,第二部分則指出簽名算法用的是HS256算法。

        然后將這個頭部進行BASE64編碼,編碼后形成頭部:

        eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

        載荷(payload)

        載荷就是存放有效信息的地方,有效信息包含三個部分:


        (1)標(biāo)準(zhǔn)中注冊的聲明(建議但不強制使用)


        iss: jwt簽發(fā)者

        sub: jwt所面向的用戶

        aud: 接收jwt的一方

        exp: jwt的過期時間,這個過期時間必須要大于簽發(fā)時間

        nbf: 定義在什么時間之前,該jwt都是不可用的.

        iat: jwt的簽發(fā)時間

        jti: jwt的唯一身份標(biāo)識,主要用來作為一次性token,從而回避重放攻擊。

        (2)公共的聲明


        公共的聲明可以添加任何的信息,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息. 

        但不建議添加敏感信息,因為該部分在客戶端可解密.


        (3)私有的聲明


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

        因為base64 是對稱解密的,意味著該部分信息可以歸類為明文信息。

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

        上面就是一個簡單的載荷的明文,接下來使用base64加密:

        eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

        簽證(signature)

        jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:


        header (base64后的)

        payload (base64后的)

        secret

        這個部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,

        然后通過header中聲明的加密方式進行加鹽secret組合加密,然后就構(gòu)成了jwt的第 三部分。


        結(jié)論:


        1 jwt的一個有規(guī)則的token


        2 它有三部分組成:Header.payload.signature,每部分都是通過base64加密而成的


        3 jwt每個部分都是可以解密的

        ————————————————


          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,

        轉(zhuǎn)載請附上原文出處鏈接和本聲明。

                                

        原文鏈接:https://blog.csdn.net/weixin_43814195/article/details/84957153            



                                




        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: jwt

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 油尖旺区| 德格县| 桐梓县| 福泉市| 宁国市| 永昌县| 满城县| 巴马| 杂多县| 利津县| 左权县| 虎林市| 洪洞县| 蓝田县| 仙桃市| 康平县| 二手房| 吴川市| 迭部县| 偃师市| 柏乡县| 青州市| 增城市| 晋城| 桃园市| 庆阳市| 常熟市| 武陟县| 色达县| 比如县| 砚山县| 鹤庆县| 托克逊县| 景东| 潞城市| 临夏县| 聂荣县| 广丰县| 灌云县| 阳城县| 酒泉市|