最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

JWT技術(shù)詳解

2023-06-26 11:32 作者:Ju加油坊  | 我要投稿

?一、JWT簡介

??? JWT是json web token縮寫。它將用戶信息加密到token里,服務(wù)器不保存任何用戶信息。服務(wù)器通過使用保存的密鑰驗證token的正確性,只要正確即通過驗證。

優(yōu)點(diǎn)是在分布式系統(tǒng)中,很好地解決了單點(diǎn)登錄問題以及session共享的問題。

缺點(diǎn)是無法作廢已頒布的令牌/不易應(yīng)對數(shù)據(jù)過期。

?

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

??? 1、JWT長什么樣?

JWT是由三段信息構(gòu)成的,將這三段信息文本用.鏈接一起就構(gòu)成了Jwt字符串。就像這樣:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

?2、JWT的構(gòu)成

第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似于飛機(jī)上承載的物品),第三部分是簽證(signature).

header

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

聲明類型,這里是jwt

聲明加密的算法 通常直接使用 HMAC SHA256

完整的頭部就像下面這樣的JSON:

{

? 'typ': 'JWT',

? 'alg': 'HS256'

}

然后將頭部進(jìn)行base64加密(該加密是可以對稱解密的),構(gòu)成了第一部分.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

?playload

載荷就是存放有效信息的地方。這個名字像是特指飛機(jī)上承載的貨品,這些有效信息包含三個部分

  • 標(biāo)準(zhǔn)中注冊的聲明

  • 公共的聲明

  • 私有的聲明

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

  • iss: jwt簽發(fā)者

  • sub: jwt所面向的用戶

  • aud: 接收jwt的一方

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

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

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

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

公共的聲明
? 公共的聲明可以添加任何的信息,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息.但不建議添加敏感信息,因為該部分在客戶端可解密.

私有的聲明
? 私有聲明是提供者和消費(fèi)者所共同定義的聲明,一般不建議存放敏感信息,因為base64是對稱解密的,意味著該部分信息可以歸類為明文信息。

定義一個payload:

{? "sub": "1234567890",? "name": "John Doe",? "admin": true}?

然后將其進(jìn)行base64加密,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

signature

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

  • header (base64后的)

  • payload (base64后的)

  • secret

這個部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進(jìn)行加鹽secret組合加密,然后就構(gòu)成了jwt的第三部分。

// javascriptvar encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

將這三部分用.連接成一個完整的字符串,構(gòu)成了最終的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW

?

? 三、JWT的應(yīng)用

?? 一般是在請求頭里加入Authorization或(XX_token,并加上XX標(biāo)注:

????

服務(wù)端會驗證token,如果驗證通過就會返回相應(yīng)的資源。整個流程就是這樣的:

token驗證流程圖

? 開發(fā)依賴包:

? <dependency>

???????????????????????? <groupId>io.jsonwebtoken</groupId>

???????????????????????? <artifactId>jjwt</artifactId>

???????????????????????? <version>0.9.1</version>

???????????????? </dependency>


四、總結(jié)

1、因為json的通用性,所以JWT是可以進(jìn)行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。

2、因為有了payload部分,所以JWT可以在自身存儲一些其他業(yè)務(wù)邏輯所必要的非敏感信息。

3、便于傳輸,jwt的構(gòu)成非常簡單,字節(jié)占用很小,所以它是非常便于傳輸?shù)摹?/p>

4、它不需要在服務(wù)端保存會話信息, 所以它易于應(yīng)用的擴(kuò)展


JWT技術(shù)詳解的評論 (共 條)

分享到微博請遵守國家法律
兰州市| 靖边县| 宁明县| 辉南县| 西丰县| 金平| 右玉县| 枝江市| 张家口市| 西充县| 富宁县| 会宁县| 崇左市| 永和县| 陆良县| 永州市| 岑巩县| 栖霞市| 渑池县| 历史| 杨浦区| 屏山县| 固原市| 裕民县| 玛沁县| 鄢陵县| 铁岭市| 焦作市| 吴堡县| 丹东市| 北安市| 阿鲁科尔沁旗| 武强县| 青铜峡市| 黔江区| 定远县| 韶关市| 尖扎县| 嘉定区| 宝山区| 龙泉市|