偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

你真的深知JWT(JSON Web Token)了嗎?

開(kāi)發(fā) 前端
頒發(fā)訪問(wèn)令牌是授權(quán)服務(wù)的關(guān)鍵所在,OAuth2.0規(guī)并未約束訪問(wèn)令牌內(nèi)容的生成規(guī)則,只要符合唯一性、不連續(xù)性、不可猜性。 與其是一個(gè)隨機(jī)字符串,不如結(jié)構(gòu)化令牌更有可讀性,用得最多的就是JWT。

[[347249]]

 頒發(fā)訪問(wèn)令牌是授權(quán)服務(wù)的關(guān)鍵所在,OAuth2.0規(guī)并未約束訪問(wèn)令牌內(nèi)容的生成規(guī)則,只要符合唯一性、不連續(xù)性、不可猜性。

與其是一個(gè)隨機(jī)字符串,不如結(jié)構(gòu)化令牌更有可讀性,用得最多的就是JWT。

什么是JWT?

 

JWT是一個(gè)開(kāi)放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊自包含的方式,作為JSON對(duì)象安全傳輸信息,結(jié)構(gòu)化封裝生成token的技術(shù)。
結(jié)構(gòu)化后的token可被賦予豐富含義,這是與無(wú)意義的隨機(jī)字符串形式token的最大區(qū)別。

JWT 的結(jié)構(gòu)是怎樣的?

 

 

HEADER(頭部)

 

裝載令牌類型和算法等信息,是JWT的頭部。

  • typ 表示第二部分PAYLOAD是JWT類型
  • alg 表示使用HS256對(duì)稱簽名的算法

 

PAYLOAD(數(shù)據(jù)體)

 

JWT的數(shù)據(jù)體,代表了一組數(shù)據(jù)。

  • sub

           令牌的主體,一般設(shè)為資源擁有者的唯一標(biāo)識(shí)

  • exp

          令牌的過(guò)期時(shí)間戳

  • iat

          令牌頒發(fā)的時(shí)間戳

是JWT規(guī)范性的聲明,PAYLOAD表示的一組數(shù)據(jù)允許我們自定義聲明。

 

SIGNATURE(簽名)

 

簽名后的JWT整體結(jié)構(gòu),是被.分割的三段內(nèi)容:header.payload.signature。JWT令牌直接用肉眼,看起來(lái)還是毫無(wú)意義,但如果拷貝到 https://jwt.io/ 在線校驗(yàn),即可看到解碼后的有意義數(shù)據(jù)。

SIGNATURE表示對(duì)JWT信息的簽名。

作用

 

可能你覺(jué)得,有了HEADER和PAYLOAD就可讓令牌攜帶信息在網(wǎng)絡(luò)中傳輸了,但在網(wǎng)絡(luò)中傳輸這樣的信息體不安全。必須加密簽名,而SIGNATURE就是對(duì)信息的簽名結(jié)果,當(dāng)受保護(hù)資源接收到三方軟件的簽名后需要驗(yàn)證令牌的簽名是否合法。

令牌內(nèi)檢

 

定義

 

既然授權(quán)服務(wù)頒發(fā)令牌,受保護(hù)資源服務(wù)就要驗(yàn)證令牌。而受保護(hù)資源調(diào)用授權(quán)服務(wù)提供的檢驗(yàn)令牌的服務(wù)的這種校驗(yàn)令牌方式就叫令牌內(nèi)檢。

特點(diǎn)

 

有時(shí)授權(quán)服務(wù)依賴DB,然后受保護(hù)資源服務(wù)也依賴該DB,即“共享DB”。微服務(wù)架構(gòu)下,不同系統(tǒng)間依靠服務(wù)而非DB通信,比如授權(quán)服務(wù)給受保護(hù)資源服務(wù)提供一個(gè)RPC服務(wù):

JWT令牌本身包含了之前所要依賴DB或依賴RPC服務(wù)才能拿到的信息,比如某用戶為某軟件進(jìn)行授權(quán)等信息。

JWT令牌怎么用?

 

  • 有JWT令牌后的通信方式

授權(quán)服務(wù)發(fā)個(gè)令牌,受保護(hù)資源服務(wù)接這令牌,然后開(kāi)始解析令牌所含信息,無(wú)需再去查詢DB或RPC調(diào)用。即實(shí)現(xiàn)了令牌內(nèi)檢。

為什么令牌要編碼且簽名?

 

授權(quán)服務(wù)頒發(fā)JWT后給到xx軟件,xx拿著令牌請(qǐng)求受保護(hù)資源服務(wù),即我在公眾號(hào)里的文章。顯然令牌要在公網(wǎng)傳輸。
所以傳輸過(guò)程令牌還要做到:

  • 編碼,以防亂碼
  • 簽名及加密,以防數(shù)據(jù)信息泄露。

JJWT是開(kāi)源較方便的JWT工具,開(kāi)箱即用。封裝Base64URL編碼和對(duì)稱HMAC、非對(duì)稱RSA的一系列簽名算法。

使用JJWT可方便生成一個(gè)經(jīng)過(guò)簽名的JWT令牌,以及解析一個(gè)JWT令牌。

  1. String sharedTokenSecret="hellooauthhellooauthhellooauthhellooauth";//密鑰 
  2. Key key = new SecretKeySpec(sharedTokenSecret.getBytes(), 
  3.                 SignatureAlgorithm.HS256.getJcaName()); 
  4.  
  5. //生成JWT令牌 
  6. String jwts= 
  7. Jwts.builder().setHeaderParams(headerMap).setClaims(payloadMap).signWith(key,SignatureAlgorithm.HS256).compact() 
  8.  
  9. //解析JWT令牌 
  10. Jws<Claims> claimsJws =Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jwts); 
  11. JwsHeader header = claimsJws.getHeader(); 
  12. Claims body = claimsJws.getBody(); 

JWT令牌的優(yōu)勢(shì)?

 

 

計(jì)算代替存儲(chǔ)

 

時(shí)間換空間思想。這種計(jì)算并結(jié)構(gòu)化封裝,減少了“共享DB” 因遠(yuǎn)程調(diào)用而帶來(lái)的網(wǎng)絡(luò)傳輸性能損耗,所以可能節(jié)省時(shí)間。

 

加密

 

因JWT令牌內(nèi)部已包含重要信息,所以傳輸過(guò)程都必須被要求密文傳輸,被強(qiáng)制要求加密也保障了傳輸安全性。

 

增強(qiáng)系統(tǒng)可用性和可伸縮性

 

JWT令牌,通過(guò)“自編碼”方式包含身份驗(yàn)證需信息,不再需要服務(wù)端額外存儲(chǔ),所以每次的請(qǐng)求都是無(wú)狀態(tài)會(huì)話。符合盡可能遵循無(wú)狀態(tài)架構(gòu)設(shè)計(jì)原則,即增強(qiáng)了系統(tǒng)可用性和伸縮性。

JWT令牌的缺陷

 

無(wú)法在使用過(guò)程中修改令牌狀態(tài)。
比如我在使用xx時(shí),可能因?yàn)槟氂性蛐薷牧嗽诠娞?hào)平臺(tái)的密碼或突然取消了給xx的授權(quán)。這時(shí),令牌狀態(tài)就該有變更,將原來(lái)對(duì)應(yīng)令牌置無(wú)效。

但使用JWT時(shí),每次頒發(fā)的令牌都不會(huì)存在服務(wù)端,無(wú)法改變令牌狀態(tài)。這表示JWT令牌在有效期內(nèi)暢通無(wú)阻。

那么可以把JWT令牌存儲(chǔ)在一個(gè)分布式內(nèi)存數(shù)據(jù)庫(kù)比如Redis中嗎?
NO!這違背JWT意義 - 將信息結(jié)構(gòu)化存入令牌本身。通常有兩種方案:

  • 將每次生成JWT令牌時(shí)的秘鑰粒度縮小到用戶級(jí)別,即一個(gè)用戶一個(gè)秘鑰

           如此,當(dāng)用戶取消授權(quán)或修改密碼,可讓該密鑰一起修改。這種方案一般還需配套單獨(dú)密鑰管理服務(wù)

  • 在不提供用戶主動(dòng)取消授權(quán)的環(huán)境里面,若只考慮修改密碼場(chǎng)景,即可把用戶密碼作為JWT的密鑰。這也是用戶粒度。這樣用戶修改密碼也就相當(dāng)于修改了密鑰。

令牌的生命周期

 

令牌都有有效期,只是JWT可把有效期的信息存在本身結(jié)構(gòu)。

OAuth 2.0的令牌生命周期,通常有三種情況:

1.令牌自然過(guò)期

該過(guò)程不排除主動(dòng)銷毀令牌的可能,比如令牌被泄露,授權(quán)服務(wù)可讓令牌失效。

2.訪問(wèn)令牌失效后可使用刷新令牌請(qǐng)求新令牌,提高用戶使用三方軟件的體驗(yàn)。

3.讓三方軟件比如xx,主動(dòng)發(fā)起令牌失效請(qǐng)求,然后授權(quán)服務(wù)收到請(qǐng)求后讓令牌立即失效。
何時(shí)需要該機(jī)制?
比如用戶和三方軟件間存在一種訂購(gòu)關(guān)系:我購(gòu)買了xx軟件,那么到期或退訂時(shí)且我授權(quán)的token還未到期情況下,就需這樣一種令牌撤回協(xié)議,支持xx主動(dòng)發(fā)起令牌失效請(qǐng)求。作為開(kāi)放平臺(tái),也建議有責(zé)任的三方軟件遵守這樣的一種令牌撤回協(xié)議。

總結(jié)

 

OAuth 2.0 的核心是授權(quán)服務(wù),沒(méi)有令牌就沒(méi)有OAuth,令牌表示授權(quán)后的結(jié)果。令牌在OAuth 2.0系統(tǒng)中對(duì)于第三方軟件都是不透明的。需要關(guān)心令牌的,是授權(quán)服務(wù)和受保護(hù)資源服務(wù)。

  1. JWT 默認(rèn)是不加密,但也是可以加密的。生成原始 Token 以后,可以用密鑰再加密一次
  2. JWT 不加密的情況下,不能將秘密數(shù)據(jù)寫入 JWT
  3. JWT 不僅可以用于認(rèn)證,也可以用于交換信息。有效使用 JWT,可以降低服務(wù)器查詢數(shù)據(jù)庫(kù)的次數(shù)
  4. JWT 的最大缺點(diǎn)是,由于服務(wù)器不保存 session 狀態(tài),因此無(wú)法在使用過(guò)程中廢止某個(gè) token,或者更改 token 的權(quán)限。也就是說(shuō),一旦 JWT 簽發(fā)了,在到期之前就會(huì)始終有效,除非服務(wù)器部署額外的邏輯
  5. JWT 本身包含了認(rèn)證信息,一旦泄露,任何人都可以獲得該令牌的所有權(quán)限。為了減少盜用,JWT 的有效期應(yīng)該設(shè)置得比較短。對(duì)于一些比較重要的權(quán)限,使用時(shí)應(yīng)該再次對(duì)用戶進(jìn)行認(rèn)證
  6. 為了減少盜用,JWT 不應(yīng)該使用 HTTP 協(xié)議明碼傳輸,要使用 HTTPS 協(xié)議傳輸

參考

JSON Web Token 入門教程

在OAuth 2.0中,如何使用JWT結(jié)構(gòu)化令牌?

https://tools.ietf.org/html/rfc6749#section-4.4

 

 

責(zé)任編輯:姜華 來(lái)源: JavaEdge
相關(guān)推薦

2020-10-27 09:00:00

NodeJS實(shí)現(xiàn)JWT

2013-07-15 16:55:45

2020-06-29 08:32:21

高并發(fā)程序員流量

2022-06-22 13:06:48

物聯(lián)網(wǎng)數(shù)字化轉(zhuǎn)型

2009-05-18 10:57:35

.NETString特性

2024-12-04 09:41:06

2018-03-19 10:39:28

Java序列化對(duì)象

2024-02-02 08:50:20

Node.js元數(shù)據(jù)自動(dòng)化

2022-07-27 08:01:29

CMS垃圾回收器

2022-04-07 08:20:22

typeinterface前端

2022-05-09 07:27:50

ThreadLocaJava

2023-12-14 12:55:41

Pythondel語(yǔ)句

2020-09-18 06:39:18

hashMap循環(huán)數(shù)據(jù)

2025-01-14 08:32:55

JWT令牌.NET

2021-10-11 20:22:27

JWT瀏覽器接口

2019-08-05 15:05:35

2020-12-07 11:05:21

HttpClient代碼Java

2015-10-19 16:51:01

2020-03-31 10:58:38

2023-06-15 10:21:48

CSS前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)