JSON Web Token(JWT)是一個開放的標準(RFC 7519),它定義了一個緊湊且自包含的方式,用於在各方之間做爲 JSON 對象安全地傳輸信息。因爲此信息是通過數字簽名的,所以能夠被驗證和信任。html
今天咱們就來簡單的認識一下 JSON Web Token。java
JWT 認證和 session認證的區別
首先須要說明 JSON Web Token 是能夠用於認證的,那麼就先來對比一下 JSON Web Token 認證和 傳統的 session 認證的區別,傳統的 session 認證是有狀態的,也就是說咱們須要在服務端保存用戶的認證信息,若是服務端從新或者換一臺服務器,那麼這個認證就失效了,而且傳統的 session 的認證方式擴展起來不是那麼的容易。算法
基於 JSON Web Token 的鑑權機制相似於 http 協議,是一種無狀態的,服務器不須要保存用戶的認證信息或者會話信息,這也就意味着 JWT 認證機制的應用不須要去考慮用戶在哪一臺服務器登陸了,這就爲應用的擴展提供了便利,也是因爲這個特性,JWT 在微服務架構中應用普遍。安全
JSON Web Token 的組成
一個 JSON Web Token 實際上就是一個字符串,它由三部分組成:頭部、載荷與簽名,以下圖所示:服務器
一、頭部(header )
頭部用於描述關於該 JSON Web Token 的最基本的信息,例如其類型以及簽名所用的算法等,一般以下所示:微信
{ "alg": "HS256", "typ": "JWT" }
- alg屬性:表示簽名使用的算法,默認爲HMAC SHA256(寫爲HS256)
- typ屬性:表示令牌的類型,JWT令牌統一寫爲JWT
頭部通常使用 base64 加密,加密後密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9session
二、載荷(payload)
載荷是 JSON Web Token 的主體內容部分,裏面存放一些有效信息,JSON Web Token 標準定義中定義瞭如下 5 個字段:架構
- iss: 該JWT的簽發者
- sub: 該JWT所面向的用戶
- aud: 接收該JWT的一方
- exp(expires): 何時過時,這裏是一個Unix時間戳
- iat(issued at): 在何時簽發的
除了標準定義中的字段外,咱們還能夠自定義字段,好比在 JWT 中,咱們的載荷信息可能以下:微服務
{ "sub": "1234567890", "name": "pingtouge", "admin": true }
咱們須要注意,在默認狀況下 JWT 是未加密的,每個人均可以讀取其內容,所以在載荷中,不要存放私密信息,防止信息泄露。學習
三、簽名(signature)
簽名是 JSON Web Token 中比較重要的一部分,前面兩部分都是使用 Base64 進行編碼的,signature 須要使用編碼後的 header 和 payload 以及咱們提供的一個密鑰,而後使用 header 中指定的簽名算法(HS256)進行簽名,簽名的做用是保證 JWT 沒有被篡改過。
爲何須要簽名?
對於加密算法來講,碰撞機率仍是比較小的,通常而言,不一樣的輸入加密後的輸出是不同的,不一樣輸入產生相同結果的機率仍是至關小的,因此能夠利用加密算法的這個特性來判斷 JWT 是否被篡改過。
假若有人篡改了載荷中的信息,再進行編碼的話,那麼新的頭部和載荷的簽名跟以前的簽名是不同的,而且如何加密的密鑰不同的話,得出來的簽名結果也會不同。
JWT使用場景
- Authentication(鑑權)
這是使用JWT最多見的狀況。 一旦用戶登陸,每一個後續請求都將包含JWT,容許用戶訪問該令牌容許的路由,服務和資源。 單點登陸是當今普遍使用JWT的一項功能,由於它的開銷很小,而且可以輕鬆地跨不一樣域使用。
- Information Exchange(信息交換)
JSON Web Tokens是在各方之間安全傳輸信息的好方式。 由於JWT能夠簽名:例如使用公鑰/私鑰對,因此能夠肯定發件人是他們自稱的人。 此外,因爲使用標頭和有效載荷計算簽名,所以您還能夠驗證內容是否未被篡改。
以上就是 JSON Web Token 相關知識,但願這篇文章對您的學習或者工做有所幫助,若是您以爲文章有幫助,歡迎幫忙轉發,謝謝。
最後
目前互聯網上不少大佬都有 JSON Web Token 相關文章,若有雷同,請多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有所錯誤之處,還望提出,謝謝。
歡迎掃碼關注微信公衆號:「互聯網平頭哥」,和平頭哥一塊兒學習,一塊兒進步。
原文出處:https://www.cnblogs.com/jamaler/p/12306230.html