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