[筆記] 甚麼是 JWT
JWT 是一種基於 JSON 的開放標準 ( RFC 7519 ),用於簽名雙方之間的訊息確保安全的以 JSON 物件傳輸
一般被用在使用者登入後的授權 ( 例如 : 單一登入 SSO )、訊息交換
單一登入 SSO
,稱為 Single sign-on,指的是當使用者登入時,可以取得所有系統的存取權限,不必對每個系統逐一登入,相同的,只需要單一登出就可以結束對於多個系統的存取權限,就稱單一登出,此技術可以讓使用者不必頻繁的輸入密碼
Session 與 JWT 的差異
Session
過去的專案大多透過 Session 實作驗證機制
驗證機制說明 :
- 使用者成功登入後,會在伺服器建立 Session,並提供客戶端 Session ID ( 存在 Cookie 中 )
- 之後來自客戶端的請求,伺服器會以 Session ID 來尋找 Session 以確認使用者的驗證狀態
此方式資料庫的花費成本會非常高,因為每個用戶登入,都必須為他建立和存取 Session
JWT
驗證機制說明 :
- 使用者成功登入後,伺服器會產生包含 JWT 字串的 Token 發送給客戶端 ( 大多存在瀏覽器的 Storage 中 )
- 之後來自客戶端的請求,都會附帶此 Token 讓伺服器驗證
此設計更符合 Stateless 無狀態的原則
- 代表每一個請求都是獨立且分離的,伺服器中並沒有保存客戶端的狀態資訊
使用時機
- 跨伺服器的請求
- 一次性、時效短的請求
- APP 身份驗證
JWT 的結構
JWT 的組成內容分為三個部分,由
.
做為區隔串成一個 JWT 字串Header ( Base64 編碼後的 )
.Payload ( Base64 編碼後的 )
.Signature ( Base64 編碼後的 )
1.Header
包含 Token 的種類與產生簽名要使用的算法等
必要欄位 :
alg
: 簽名的算法,未簽名的需設置為none
非必要欄位 :
typ
: Token 的種類,設置為JWT
cty
: 內容類型,巢狀 JWT 需設置為JWT
,較少出現
1 | { |
- 並將此透過 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攻擊 )