一分鐘簡單了解JSON Web Token

2021-01-13 計算機java編程

JSON Web Token(JWT)是一個開放的標準(RFC 7519),它定義了一個緊湊且自包含的方式,用於在各方之間作為 JSON 對象安全地傳輸信息。由於此信息是經過數字籤名的,因此可以被驗證和信任。

今天我們就來簡單的認識一下 JSON Web Token。

JWT 認證和 session認證的區別

首先需要說明 JSON Web Token 是可以用於認證的,那麼就先來對比一下 JSON Web Token 認證和 傳統的 session 認證的區別,傳統的 session 認證是有狀態的,也就是說我們需要在服務端保存用戶的認證信息,如果服務端重新或者換一臺伺服器,那麼這個認證就失效了,並且傳統的 session 的認證方式擴展起來不是那麼的容易。

基於 JSON Web Token 的鑑權機制類似於 http 協議,是一種無狀態的,伺服器不需要保存用戶的認證信息或者會話信息,這也就意味著 JWT 認證機制的應用不需要去考慮用戶在哪一臺伺服器登錄了,這就為應用的擴展提供了便利,也是由於這個特性,JWT 在微服務架構中應用廣泛。

JSON Web Token 的組成

一個 JSON Web Token 實際上就是一個字符串,它由三部分組成:頭部、載荷與籤名,如下圖所示:

1、頭部(header )

頭部用於描述關於該 JSON Web Token 的最基本的信息,例如其類型以及籤名所用的算法等,通常如下所示:

{ "alg": "HS256", "typ": "JWT"}

alg屬性:表示籤名使用的算法,默認為HMAC SHA256(寫為HS256)typ屬性:表示令牌的類型,JWT令牌統一寫為JWT頭部一般使用 base64 加密,加密後密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

2、載荷(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 是未加密的,每一個人都可以讀取其內容,因此在載荷中,不要存放私密信息,防止信息洩露。

3、籤名(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 相關知識,希望這篇文章對您的學習或者工作有所幫助,如果您覺得文章有幫助,歡迎幫忙轉發,謝謝。

相關焦點

  • (建議收藏)|Spring Boot集成JSON Web Token(JWT)
    一:認證在了解JWT之前先來回顧一下傳統session認證和基於token認證。## 1.1 傳統session認證http協議是一種無狀態協議,即瀏覽器發送請求到伺服器,伺服器是不知道這個請求是哪個用戶發來的。為了讓伺服器知道請求是哪個用戶發來的,需要讓用戶提供用戶名和密碼來進行認證。
  • 侵入JSON Web Token(JWT)
    全文共4545字,預計學習時長13分鐘但是,若不在生產環境中關閉該功能,攻擊者可以通過將alg欄位設置為「None」來偽造他們想要的任何token,接著便可以使用偽造的token冒充任意用戶登陸網站。2. HMAC算法JWT兩種最常用的算法是HMAC和RSA。HMAC用同一個密鑰對token進行籤名和認證。而RSA需要兩個密鑰,先用私鑰加密創建token,然後使用其對應的公鑰來認證。
  • Json Web Token(JWT)的使用
    什麼場景使用JSON Web TokensAuthorization:這個是最常用的場景,當用戶登錄後,服務端返回一個token,客戶端攜帶這個token就可以訪問token許可資源。Information Exchange:使用JWT可以在多個系統進行系統交換,因為JWT可以被加密。JWT的結構JWT的結構有以下三部分組成,用句號(.)分割。
  • 5分鐘!就能學會以太坊 JSON API 基礎知識!
    "headers = {'Content-type': 'application/json'}為了簡單起見,我們使用Infura節點連接到Ethereum Ropsten Testnet。你的第一個請求讓我們先來了解一下網絡當前的gas價格。
  • JSON對象和簡單練習
    JSON對象和簡單練習前面一篇我們查找的圖書的name都是通過逗號隔開,然後拼接成一個字符串傳給瀏覽器。其實我們可以把多個圖書名稱用數組格式傳給瀏覽器,前端JS代碼通過遍歷這個數組,也是可以拿到這些name數據。現在,我們一般不用數組,而是用JSON這格式。
  • 用Scala實現簡單的Web和API伺服器
    這篇指南將向你介紹如何利用Scala簡單的HTTP伺服器,來提供Web內容和API。本文還會介紹一個完整的例子,告訴你如何構建簡單的實時聊天網站,同時支持HTML網頁和JSON API端點。這篇文及章的目的是介紹怎樣用Scala實現簡單的HTTP伺服器,從而提供網頁服務,以響應API請求。
  • 程式設計師:JSON、JSONObject 與 JSONArray 簡單講解
    省略其餘內容}可以看到 就是對 HashMap 的一層封裝,並提供了一些個性化方法。"馬馬馬馬馬百萬");JSONObject drug = new JSONObject();drug.put("drugName", "鹽酸丁卡因注射液");JSONArray array = new JSONArray();array.add(person);array.add(drug);Fastjson 的簡單應用
  • api框架 web 最好的go_golang api框架 - CSDN
    其實對於golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數或者工具的集合。藉助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規範。下面就Gin的用法做一個簡單的介紹。
  • Springmvc框架對json的支持 Java程式設計師必看
    json是一種前後端分離思想所使用的存儲數據的格式,然而使用Springmvc這個框架在對前臺參數處理時會遇到很多坑,下面我們就模擬一下前臺發送json數據看springmvc能否成功接收。路徑當做請求處理了,於是我們必須不讓他處理這個請求,讓它對靜態資源放行需要進行如下配置在web.xml中我們添加幾條通過名為default的servlet處理的url-pattern,分別對應js和css文件。
  • 全棧AI工程師指南,DIY一個識別手寫數字的web應用
    Jupyter Notebook 是一款集編程和寫作於一體的效率工具,優點: 分享便捷 遠程運行 交互式展現 在瀏覽器可以訪問Jupyter Notebook,也就是說,我可以部署成web應用的形式,用戶可以分享,通過域名訪問
  • c 怎麼發送json數據 - CSDN
    其實解析過程很簡單, 而且只用了強大的ArduinoJson庫的一小部分功能具體操作請參考本文第八節下面是 ArduinoJSON庫的核心內容:一.V6版本函數庫結構可以看出,方法主要分為四大類:JsonDocument相關,這是整個json庫的入口,它負責高效管理內存以及調用json解析器;JsonObject相關;JsonArray相關;
  • Golang 語言使用標準庫 net/rpc/jsonrpc 包跨語言遠程調用
    ,它支持JSON-RPC 1.0,通過 json 格式傳輸數據。02Go 語言 net/rpc/jsonrpc 標準庫jsonrpc 是基於 TCP 協議,不支持 HTTP 協議。jsonrpc 採用 JSON 編解碼傳輸數據,而不是採用 gob 編解碼方式。
  • rpc、json Rpc和http區別
    帶索引數組參數的rpc調用--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}<-- {"jsonrpc": "2.0", "result": 19, "id": 1} 2.
  • 基於Django和翻譯API實現web版的中英文對照翻譯(一)
    一番了解之後,決定選用谷歌翻譯/搜狗翻譯/有道翻譯官方提供的翻譯api自己實現一個web版的翻譯界面。目前搜狗翻譯/有道翻譯都已經開始收費,但收費的標準還可以讓人接受,以搜狗翻譯為例,現價:40.00/百萬字符。還是可以接受的。閒言少敘。直入正題。