jwt 就是這麼簡單

文章不保證最新,最新版請到博客 www.huborui.com/ 查看。html

JSON Web Token 是一個很是簡單實用的規範,經過它能夠在客戶端和服務端以前傳遞安全可靠的數據。web

jwt 由三部分組成:算法

  • 頭部(header)
  • 載荷(payload)
  • 簽名(signature)

將這三部分用 . 鏈接起來就構成一個 jwt(header.payload.signature)。json

下面就經過這三個部分道出從 jwt 生成到獲取數據的原理。安全

header

header 描述 jwt 的基本信息,如類型、簽名所用算法等。服務器

{
    // 類型爲 JWT
    "typ": "JWT",
    // HS256 算法
    "alg": "HS256"
}

對 header 進行 Base64 編碼,獲得第一部分。ui

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

沒錯,Base64 編碼並非加密方式,能夠還原的!不加密咱們的 jwt 還安全麼?繼續看下去。編碼

payload

payload 是攜帶數據的地方,咱們能夠將須要傳遞到服務端的數據放在 payload 內。加密

既然咱們的寶貝數據放在 payload,那它會不會被加密?設計

不會!仍是 Base64 編碼,能夠還原的!因此不要往裏面放貴重的數據。

{
    // 官方定義了 5 個字標識一些信息
    // jwt 簽發者
    "iss": "god",
    // 在何時簽發 
    "iat": 1441525213,
    // exp 何時過時 Unix 時間戳
    "exp": 1441525324,
    // 接收 jew 的用戶
    "aud": "xxx@yyy.com"
    // jwt 面向的用戶
    "sub": "xxx@yyy.com"
    // 剩下的就能夠本身定義了
    "userID": 12345,
    ...
}

依舊 Base64 編碼,獲得第二部分的字符串和 header 用 . 拼在一塊兒。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0

別急,是否是以爲都是明文的數據,服務器如何判斷 jwt 的真假呢?下面就到了簽名加密環節。

signature

在簽名環節,咱們須要提供一個只有你知道的密鑰(secret),對連在一塊兒的 header 和 payload 用 HS256 算法加密,獲得加密後的字符串,和前面的拼在一塊兒:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

三部分合體成功!jwt 構形成功!

防僞

是否能僞造 jwt 呢?仔細想一想就知道,若是你不知道服務端的密鑰,手動修改 header 或 payload 的任何部分,獲得的 Base64 編碼就不同了,新的編碼通過密鑰生成的簽名確定和舊的不一樣。沒有正確的簽名,服務器會直接返回錯誤。

服務器驗證一個 jwt 的過程也很簡單:

  1. 收到 jwt
  2. 將 header 和 payload 用密鑰和對應的算法簽名
  3. 判斷生成的簽名和 jwt 第三部分是否一致
  4. 不一致則返回錯誤,一致則表示 payload 內的數據可信

總結

jwt 的核心就是密鑰,擁有密鑰就擁有生成 jwt 的權利(千萬不能泄露)。

payload 中的數據不是加密的,不要放敏感數據。

參考資料

相關文章
相關標籤/搜索