【JWT】JWT授權(quán)認(rèn)證

歡迎關(guān)注微信公眾號:全棧工廠

本文主要參考

1. 簡介

JSON Web Token(JWT)是一種基于開放標(biāo)準(zhǔn)RFC 7519設(shè)計,使用HMACRSA算法簽名的無狀態(tài)授權(quán)令牌;由于令牌本身包含了授權(quán)所需要的所有信息,因此JWT非常適合分布式的單點服務(wù)授權(quán)認(rèn)證。
一個JWT通常由三部分組成:頭部(Header)、消息體(Payload)、簽名(Signature),大致結(jié)構(gòu)如下圖所示:

1.1 頭部(Header)

頭部一般情況下主要包含兩部分信息:

  1. 令牌類型(typ):例如 jwt;
  2. 簽名算法(alg):令牌簽名所使用的算法,例如SHA256RSA等。

所以一個JWT的header值通常為:

   header = base64UrlEncode('{"alg":"SHA256","typ":"JWT"}')
1.2 消息體(Payload)

如果我們認(rèn)為一個JWT令牌是合法的,那么我們就會從JWT的消息體里面提取令牌的身份信息,這樣我們就會知道是誰在使用這個令牌以及令牌是否過期等信息;因此消息體里主要包含令牌的所有實體信息,用戶可以自己決定要放那些信息到消息體里面。
所以一個JWT的payload值可以為:

   payload = base64UrlEncode('{ "exp": "1518087620","name": "John Doe","id":"2"}')

表示該令牌的授權(quán)人名稱是:John Doe,授權(quán)人id是:2,令牌過期時間是:1518087620。

1.3 簽名(Signature)

簽名部分主要用于驗證一個JWT令牌的合法性,驗證過程非常簡單:

  1. 從header中提取出簽名所使用的算法(例如SHA256);
  2. 獲取服務(wù)端在對Token進(jìn)行簽名時所使用的key;
  3. 使用簽名算法以及key重新計算簽名SHA256(header + "." + payload, key);
  4. 對比新生成的簽名和用戶提交上來的簽名是否一致,完全一致則令牌合法。

2. 總結(jié)

2.1 優(yōu)點

1. 緊湊的設(shè)計,方便令牌的存儲和傳輸
JWT的結(jié)構(gòu)設(shè)計讓它占用的空間更小,可自定義的消息體還可以讓令牌存儲額外的非敏感信息,簡單實用。
2. 無狀態(tài)的授權(quán)認(rèn)證,方便應(yīng)用擴展
JWT的無狀態(tài)特性讓服務(wù)的橫向擴展變得更加簡單,服務(wù)端不再需要解決類似Session共享等授權(quán)信息同步問題。
3. 統(tǒng)一的JSON對象,方便跨平臺使用
JWT的header和payload存儲的都是JSON對象,因此任何平臺的任何語言都可以很方便的進(jìn)行驗證使用。

2.2 缺點

1. 如果令牌泄漏,服務(wù)端對令牌的使用失去控制
由于服務(wù)端并不存儲令牌,如果一個JWT令牌被黑客竊取,除非借助其他技術(shù)手段,否則在該令牌有效期內(nèi),黑客可以隨意使用該令牌,服務(wù)端甚至很難發(fā)現(xiàn)該令牌已經(jīng)被竊取。
2. 令牌信息容易暴露,令牌安全完全取決于簽名key
JWT令牌的header和payload看起來是一串隨機字符串,實際上只是用base64進(jìn)行編碼了而已,用戶可以通過使用base64對其解碼看到令牌簽名所使用的算法以及payload中所存儲的授權(quán)用戶信息;這樣黑客就有可能通過header中所標(biāo)注的簽名算法對令牌的簽名進(jìn)行暴利破解,如果簽名key被破解出來,那么黑客便可以隨意生成自己的JWT令牌,后果不堪設(shè)想!因此簽名算法中所使用的key極為關(guān)鍵。

注:文中如有任何錯誤,請各位批評指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容