Spring Cloud Security 之 JWT


一、JWT基礎

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

  場景

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

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

 

二、JWT結構

  Json Web Token由三部分組成,Header(頭部)、Payload(聲明)、Signature(簽名),它們之間用圓點(.)連接,例如xxxxx.yyyyyy.zzzzz

  Header:header典型的由兩部分組成:token類型(“JWT”)和算法名稱(比如:HMAC SHA256或者RSA等等)

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

  Payload:包含聲明(要求),自定義的用戶信息,根據需求制定。比如用戶名、權限等等

{
   "name":"levi",
   "permission":["USER_ADD","USER_DELETE","USER_SEARCH"]  
}

  Signature:驗證消息在傳遞過程中有沒有被更改

 

三、JWT工作流程

  在用戶用他們的憑證登錄認證成功以后,生成一個JWT返回。此后,token就是用戶憑證了,必須非常小心防止出現安全問題(token泄露)。一般而言,保存令牌的時候不應該超過你所需要它的時間。

  無論何時用戶想要訪問受保護的路由或者資源的時候,用戶代理(通常是瀏覽器)都應該帶上JWT,典型的,通常放在Authorization header中,用Bearer schema。

  1. 應用(或者客戶端)想授權服務器請求授權。例如,如果用授權碼流程的話,就是/oauth/authorize
  2. 當授權被許可以后,授權服務器返回一個access token給應用
  3. 應用使用access token訪問受保護的資源(比如:API)

 

四、基於 Token 的身份認證 與 基於服務器的身份認證

  1、基於服務器的身份認證

    傳統的做法是將已經認證過的用戶信息存儲在服務器上,比如Session。用戶下次請求的時候帶着Session ID,然后服務器以此檢查用戶是否認證過。

    存在如下問題:

    a、session存儲內存,用戶過多,消耗內存  

    b、session共享問題

    c、跨域請求授權問題

    d、容易遭受CSRF攻擊

  2、JWT 與 session 的差異

    a、session 存儲在服務器,JWT保存在客戶端,JWT更利於減輕服務端內存壓力

    b、JWT是無狀態的,可以解決 用戶信息 共享問題

    c、JWT是加密字符串,更加安全,有助於防止CSRF攻擊

  3、JWT 與 OAuth 的區別

    a、OAuth2 是一種授權框架,JWT 是一種認證協議

    b、無論使用哪種方式切記用HTTPS來保證數據的安全性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM