筆記 - 甚麼是 JWT

[筆記] 甚麼是 JWT

  • JWT 是一種基於 JSON 的開放標準 ( RFC 7519 ),用於簽名雙方之間的訊息確保安全的以 JSON 物件傳輸

  • 一般被用在使用者登入後的授權 ( 例如 : 單一登入 SSO )、訊息交換

    • 單一登入 SSO,稱為 Single sign-on,指的是當使用者登入時,可以取得所有系統的存取權限,不必對每個系統逐一登入,相同的,只需要單一登出就可以結束對於多個系統的存取權限,就稱單一登出,此技術可以讓使用者不必頻繁的輸入密碼

Session 與 JWT 的差異

Session

  • 過去的專案大多透過 Session 實作驗證機制

  • 驗證機制說明 :

    1. 使用者成功登入後,會在伺服器建立 Session,並提供客戶端 Session ID ( 存在 Cookie 中 )
    2. 之後來自客戶端的請求,伺服器會以 Session ID 來尋找 Session 以確認使用者的驗證狀態
  • 此方式資料庫的花費成本會非常高,因為每個用戶登入,都必須為他建立和存取 Session

JWT

  • 驗證機制說明 :

    1. 使用者成功登入後,伺服器會產生包含 JWT 字串的 Token 發送給客戶端 ( 大多存在瀏覽器的 Storage 中 )
    2. 之後來自客戶端的請求,都會附帶此 Token 讓伺服器驗證
  • 此設計更符合 Stateless 無狀態的原則

    • 代表每一個請求都是獨立且分離的,伺服器中並沒有保存客戶端的狀態資訊
  • 使用時機

    • 跨伺服器的請求
    • 一次性、時效短的請求
    • APP 身份驗證

JWT 的結構

  • JWT 的組成內容分為三個部分,由 . 做為區隔串成一個 JWT 字串

  • Header ( Base64 編碼後的 ).Payload ( Base64 編碼後的 ).Signature ( Base64 編碼後的 )

1.Header

  • 包含 Token 的種類與產生簽名要使用的算法等

    • 必要欄位 :

      • alg : 簽名的算法,未簽名的需設置為 none
    • 非必要欄位 :

      • typ : Token 的種類,設置為 JWT
      • cty : 內容類型,巢狀 JWT 需設置為 JWT,較少出現
1
2
3
4
{
'typ': 'JWT',
'alg': 'HS256'
}
  • 並將此透過 Base64 編碼

2.Payload

  • 欲存放的資訊 ( 例如 : 用戶資訊 )

  • 有三種聲明 :

    • 註冊聲明 Registered Claims

      • iss (Issuer) - JWT 簽發者
      • sub (Subject) - JWT 所面向的用戶
      • aud (Audience) - JWT 接收者
      • exp (Expiration Time) - JWT 的過期時間,過期時間必須要大於簽發時間
      • nbf (Not Before) - 定義在什麼時間之前,該 JWT 是不可用的
      • iat (Issued At) - JWT 的簽發時間
      • jti (JWT ID) - JWT 的唯一身份標識,主要用來區分其他內容相似的 JWT,從而迴避重放攻擊
    • 公開聲明 Public Claims

    • 私有聲明 Private Claims

  • 並將此透過 Base64 編碼

3.Signature

  • Base64 編碼後的 Header、Payload,加上密鑰再透過算法所產生

  • 並將此透過 Base64 編碼

安全相關

  • Base64 編碼是可逆的,所以不要放敏感訊息 ( 例如 : 密碼 ) 在 JWT 中

  • 要保護好密鑰,存於伺服器端

  • 使用 HttpOnly 來防止 Cookie 被 JavaScript 讀取,避免跨站腳本攻擊 ( XSS攻擊 )

Author: Kenny Li
Link: https://kennyliblog.nctu.me/2020/09/28/JWT/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.