12.02 認識JWT--JSON Web Token

什麼是JWT

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

為什麼要使用JWT

隨著技術的發展,分佈式web應用的普及,通過session管理用戶登錄狀態成本越來越高,因此慢慢發展成為token的方式做登錄身份校驗,然後通過token去取redis中的緩存的用戶信息,隨著之後jwt的出現,校驗方式更加簡單便捷化,無需通過redis緩存,而是直接根據token取出保存的用戶信息,以及對token可用性校驗,單點登錄更為簡單。

JWT應用場景

· Authorization (授權) : 這是使用JWT的最常見場景。一旦用戶登錄,後續每個請求都將包含JWT,允許用戶訪問該令牌允許的路由、服務和資源。單點登錄是現在廣泛使用的JWT的一個特性,因為它的開銷很小,並且可以輕鬆地跨域使用。

· Information Exchange (信息交換) : 對於安全的在各方之間傳輸信息而言,JSON Web Tokens無疑是一種很好的方式。因為JWT可以被簽名,例如,用公鑰/私鑰對,你可以確定發送人就是它們所說的那個人。另外,由於簽名是使用頭和有效負載計算的,您還可以驗證內容沒有被篡改。

JWT組成

JSON Web Token由三部分組成,它們之間用圓點(.)連接。這三部分分別是:

  • Header
  • Payload
  • Signature


認識JWT--JSON Web Token

認識JWT--JSON Web Token

認識JWT--JSON Web Token

JWT工作流程

其主要流程如下:

1. 用戶攜帶用戶名和密碼請求訪問

2. 服務器校驗用戶憑據

3. 應用提供一個token給客戶端

4. 客戶端存儲token,並且在隨後的每一次請求中都帶著它

5. 服務器校驗token並返回數據

注意:

1. 每一次請求都需要token

2. Token應該放在請求header中

3. 我們還需要將服務器設置為接受來自所有域的請求,用Access-Control-Allow-Origin: *

認識JWT--JSON Web Token


1. 應用(或者客戶端)想授權服務器請求授權。例如,如果用授權碼流程的話,就是/oauth/authorize

2. 當授權被許可以後,授權服務器返回一個access token給應用

3. 應用使用access token訪問受保護的資源(比如:API)

基於JWT的身份認證和基於服務器的身份認證

傳統的做法是服務器存儲session,客戶端存儲帶有session_id的cookie,用戶下次請求的時候帶著Session ID,然後服務器以此檢查用戶是否認證過。

這種用法的弊端:

· Sessions : 每次用戶認證通過以後,服務器需要創建一條記錄保存用戶信息,通常是在內存中,隨著認證通過的用戶越來越多,服務器的在這裡的開銷就會越來越大。

認識JWT--JSON Web Token

· Scalability : 由於Session是在內存中的,這就帶來一些擴展性的問題。

· CORS : 當我們想要擴展我們的應用,讓我們的數據被多個移動設備使用時,我們必須考慮跨資源共享問題。當使用AJAX調用從另一個域名下獲取資源時,我們可能會遇到禁止請求的問題。

· CSRF : 用戶很容易受到CSRF攻擊。

JWT的好處

· 無狀態和可擴展性:Tokens存儲在客戶端。完全無狀態,可擴展。我們的負載均衡器可以將用戶傳遞到任意服務器,因為在任何地方都沒有狀態或會話信息。

· 安全:Token不是Cookie。(The token, not a cookie.)每次請求的時候Token都會被髮送。而且,由於沒有Cookie被髮送,還有助於防止CSRF攻擊。即使在你的實現中將token存儲到客戶端的Cookie中,這個Cookie也只是一種存儲機制,而非身份認證機制。沒有基於會話的信息可以操作,因為我們沒有會話!

· token在一段時間以後會過期,這個時候用戶需要重新登錄。這有助於我們保持安全。還有一個概念叫token撤銷,它允許我們根據相同的授權許可使特定的token甚至一組token無效。


分享到:


相關文章: