JWT的數(shù)據(jù)格式詳解
JWT的token包含三部分?jǐn)?shù)據(jù):
Header:頭部,通常頭部有兩部分信息:
聲明類型type,這里是JWT(type=jwt)
加密算法,自定義(rs256/base64/hs256)
我們會對頭部進(jìn)行base64加密(可解密),得到第一部分?jǐn)?shù)據(jù)
Payload:載荷,就是有效數(shù)據(jù),一般包含下面信息:
用戶身份信息-userid,username(注意,這里因為采用base64加密,可解密,
因此不要存放敏感信息)
注冊聲明:如token的簽發(fā)時間,過期時間,簽發(fā)人等
這部分也會采用base64加密,得到第二部分?jǐn)?shù)據(jù)
Signature:base64加密,簽名,是整個數(shù)據(jù)的認(rèn)證信息。
一般根據(jù)前兩步的數(shù)據(jù),再加上服務(wù)的的密鑰(secret,鹽)(不要泄漏,最好周期性更換)
,通過加密算法生成。用于驗證整個數(shù)據(jù)完整和可靠性
一個JWT實際上就是一個字符串,它由三部分組成,頭部、載荷與簽名。
————————————————
頭部(header){ "typ":"JWT", "alg":"HS256" }
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中聲明的加密方式進(jìn)行加鹽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)系工作人員刪除。