Engineering · 1 min read
JWT 是什麼:三段結構與簽章
JWT 有三段:header、payload、signature。前兩段任何人都能讀。簽章是唯一需要金鑰的部分。
JWT(JSON Web Token)是一個簽過章的 JSON 物件。三段用點號分隔。
每段是 base64url 編碼。任何人都能解碼 header 和 payload。JWT 不是加密。簽章是唯一需要金鑰的部分。
| 部分 | 內容 | 任何人都能讀? |
|---|---|---|
| Header | 演算法、token 類型 | 是,base64 解碼 |
| Payload | 宣告(sub、aud、exp、iss) | 是,base64 解碼 |
| Signature | 完整性證明 | 否,需要金鑰驗證 |
簽章回答一個問題:「持有金鑰的人,建立了這段 header + payload 嗎?」攻擊者改動 payload 的任何一個位元,簽章就壞掉。
警告: JWT 不隱藏資料。不要把密碼或 API key 放進 payload。
稽核中的發現: 朋友的 side project 把 email 和 displayName 放在 payload。這沒問題,這些不是秘密。但如果有人把密碼也塞進去,就等於公開了。
「簽章回答『有沒有被改過』。但它不回答:誰簽的、給誰用、還有沒有效。」
參考來源
Related
回到總覽:一次 JWT 稽核背後的七個盲點 · 對稱與非對稱簽章 · 六個標準宣告