什麼是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工作流程
其主要流程如下:
1. 用戶攜帶用戶名和密碼請求訪問
2. 服務器校驗用戶憑據
3. 應用提供一個token給客戶端
4. 客戶端存儲token,並且在隨後的每一次請求中都帶著它
5. 服務器校驗token並返回數據
注意:
1. 每一次請求都需要token
2. Token應該放在請求header中
3. 我們還需要將服務器設置為接受來自所有域的請求,用Access-Control-Allow-Origin: *
1. 應用(或者客戶端)想授權服務器請求授權。例如,如果用授權碼流程的話,就是/oauth/authorize
2. 當授權被許可以後,授權服務器返回一個access token給應用
3. 應用使用access token訪問受保護的資源(比如:API)
基於JWT的身份認證和基於服務器的身份認證
傳統的做法是服務器存儲session,客戶端存儲帶有session_id的cookie,用戶下次請求的時候帶著Session ID,然後服務器以此檢查用戶是否認證過。
這種用法的弊端:
· Sessions : 每次用戶認證通過以後,服務器需要創建一條記錄保存用戶信息,通常是在內存中,隨著認證通過的用戶越來越多,服務器的在這裡的開銷就會越來越大。
· 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無效。
閱讀更多 艾碼 的文章