JWT在項目中實踐小結

  JWT即JSON WEB TOKEN的縮寫,輕量級的令牌認證(相比於oauth),可用於數據交換間的安全傳輸,同時可以使用公鑰/私鑰的非對稱算法對信息進行數字簽名,如RS256算法。javascript

  它由3部分組成:php

  • Header  頭信息
  • Payload  荷載信息,實際數據;一個token的第二個部分是荷載信息,它包含一些聲明Claim(實體的描述,一般是一個User信息,還包括一些其餘的元數據)
  • Signature  由頭信息+荷載信息+密鑰 組合以後進行加密獲得,使用header中指定的算法將編碼後的header、編碼後的payload、一個secret進行加密

  3部分的所包含的內容及詳細組成網上已不少,這裏再也不囉嗦,咱們只對jwt實際使用過程的注意事項及坑作下分享,但願後來者能夠更好的使用jwt。   html

  【一】項目實踐中須要注意一下幾點:  前端

  一、因爲palyload部分的實際數據可很容易被解出,因此在實際應用中,切記不可在其中傳輸敏感數據,如密碼、祕鑰等信息,jwt能作到的主要是防止數據被篡改。java

  二、非對稱算法,如RS256皆是服務於簽名,即Signature部分,目的就是爲了讓服務器能夠很明確的知道收到的數據是否合法,所以在客戶端去作此jwt生成過程是不明智的,容易將密鑰公之於衆,這樣也就失去了jwt防篡改功能。(有一點想不明白的是,若是使用非對稱算法,那麼公鑰理論能夠公開,這時候如何保證數據的合法性??咱們目前使用的是HS256算法,只有一個密鑰且不可公開)node

  三、jwt涉及base64及加密處理,因此會使傳輸的數據會比裸傳數據大不少,這個須要根據實際狀況評估並作好平衡git

 【二】 可能的使用場景:github

  一、單點登陸,此場景也是使用最廣的一種,流程原理很簡單:算法

  用戶登陸成功-》生成token返回前端並保存(cookie或localstorage)-》以後每次請求在header或body中帶此token-》服務器驗證此token以保證數據合法性segmentfault

  如下引用jwt官網的一張圖,可大概說明以上jwt過程:

    此場景應用相比於cookie直接保存登陸信息,可有效防止CSRF攻擊(原理可見:https://segmentfault.com/a/1190000003716037),

  CSRF (Cross Site Request Forgery),它講的是你在一個瀏覽器中打開了兩個標籤頁,其中一個頁面經過竊取另外一個頁面的 cookie 來發送僞造的請求,由於 cookie 是隨着請求自動發送到服務端的。

    二、與第三方接口的數據傳輸,在處理對外接口時(特別是公司以外業務)可很方便的做爲一個約定,可很好的減小因爲數據安全性問題所要作的溝通工做。

  但因爲jwt涉及base64及加密處理,因此會使傳輸的數據會比裸傳數據大不少,這方面你們能夠根據實際狀況作平衡取捨。對於公司內部的項目及對傳輸數據量有極高要求的更要慎重考慮用jwt方式;對於這種狀況,咱們目前的處理方式是模仿jwt,但使用內部約定的簽名方式對數據進行數字簽名,以達到目的。

【三】JWT、JWS、JWE區別(網上摘錄)

  一開始很迷茫於這幾個縮寫的區別,應該不少人跟我有一樣迷茫,特地查了下,

  一、3個的全拼:JWT(JSON Web Tokens)、JWS(JSON Web Signature)、JWE(JSON Web Encryption)

  二、關於JWT,可參考RFC7519(https://tools.ietf.org/html/rfc7519)的描述:

  JSON Web Token (JWT) 是一個間接地、URL安全的,表現爲一組聲明,能夠在雙方之間進行傳輸。一個JWT的聲明,是指通過編碼後的一個JSON對象,這個JSON對象能夠是一個JSON Web     Signature(JWS)結構的荷載(payload),或者是一個JSON Web Encryption(JWE)結構的明文。容許使用聲明進行數字簽名,或者經過一個Message Authentication Code(MAC)進行完整性保護可選擇是否加密。

  即,一組JWT聲明(JSON格式的Claims)被經過JWS結構或JWE結構發送。JWS和JWE其實是一個荷載,JWT則是一種基於荷載的實際實現。

  三、JWS,對內容進行數字化簽名

  四、JWE,對內容進行加密,而不是簽名,JWT聲明會被加密碼,所以帶來了內容的保密性。JWE能夠被簽名並附在JWS裏。這樣的話就能夠同時加密和簽名。

  五、對於客戶端,分辨JWS或JWE

  JWS的Header與JWE的Header是不一樣的,能夠經過檢查「alg」Header參數的值來區分。若是這個值表現爲一個數字簽名或者MAC的算法,或者是」none「,則它是一個JWS。

  若是它表現爲一個 Key Encryption, Key Wrapping, Direct Key Agreement, Key Agreement with Key Wrapping, or Direct Encryption algorithm。則它是一個JWE。

  還能夠經過Header裏的「enc」(encryption algorithm)是否存在來判斷,若是"enc"這個成員存在的話說明是JWE,不然的話就是JWS.

附,如下我整理了下開發過程用到的jwt包:

在線debuger及各類語言lib包:https://jwt.io/ 

php包:https://github.com/psecio/jwt

javascript/nodejs包:https://kjur.github.com/jsrsasign

相關文章
相關標籤/搜索