JWT:那些長字串裡實際上有什麼
深入解析 JSON Web Token 的三段式結構、簽名驗證機制和有效載荷內容。了解 JWT 在身份驗證中的工作原理,避免令牌洩露等常見安全錯誤。
你在認證系統中看到一個像 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U 的字串。
那是什麼?這是一個 JWT——三個用點分隔的 Base64 編碼塊。而且你可以在沒有任何特殊金鑰的情況下讀取它。
三個部分
標頭: 演算法和 token 類型
{"alg": "HS256", "typ": "JWT"}
有效載荷: 實際資料(聲明)
{"sub": "1234567890", "name": "John", "iat": 1516239022}
簽章: 驗證沒有被篡改
JWT 不是加密的
這是重要的一點。任何人都可以解碼 JWT 並讀取其內容。Base64 是編碼,不是加密。
不要在 JWT 中放入秘密。使用者 ID、權限、到期時間——可以。密碼、信用卡、私密資料——絕不。
標準聲明
iss — 發行者。誰創建了這個 token。
sub — 主體。通常是使用者 ID。
exp — 到期。token 變為無效的 Unix 時間戳。
iat — 發行時間。token 創建的時間。
aud — 受眾。誰應該接受這個 token。
自訂聲明也有效。添加你的應用程式需要的任何資料。
簽章如何工作
簽章證明 token 沒有被修改。
伺服器創建 token → 用秘密金鑰簽名 → 發送給客戶端。 客戶端發送 token 回來 → 伺服器驗證簽章 → 信任內容。
如果有人更改有效載荷,簽章將不匹配。伺服器拒絕它。
但伺服器必須驗證簽章。沒有驗證的 JWT 是安全劇場。
常見安全錯誤
不驗證簽章。 有些程式碼解碼 JWT 而不檢查簽章。任何人都可以偽造 token。
使用弱秘密。 secret123 不是秘密。使用長的、隨機的字串。
忽略到期。 總是檢查 exp。Token 應該有短的生命週期。
演算法混淆。 alg 欄位說明如何驗證。如果你的程式碼信任標頭,攻擊者可以將它設定為 none 並跳過驗證。
儲存敏感資料。 任何擁有 token 的人都可以讀取有效載荷。將秘密保留在伺服器端。
何時使用 JWT
無狀態認證。 伺服器不需要儲存會話。token 包含所需的一切。
微服務。 服務可以在不調用認證伺服器的情況下驗證 token。
單一登入。 跨域共享認證。
何時不使用 JWT
簡單應用程式。 會話 cookie 更簡單且更難搞砸。
需要立即撤銷。 JWT 在到期前有效。撤銷需要額外的基礎設施。
大型有效載荷。 每個請求都攜帶完整的 token。大 token 意味著更多頻寬。
Refresh Token
存取 token 應該是短期的(幾分鐘到幾小時)。Refresh token 在不重新認證的情況下獲得新的存取 token。
安全地儲存 refresh token。它們是長期且強大的。
JWT 很方便但需要謹慎。理解它們包含什麼,正確驗證簽章,設定短到期時間,永遠不要在有效載荷中放入敏感資料。