截至目前為止,關於JWT的教學我們已經完成了:
今天,我們要進一步拉高層級,探討 JWT 的安全性問題,以及常見的防禦策略。
很多人會說「JWT 不安全」,但其實大多是「使用不當」造成的漏洞。
JWT 的安全基礎就是「簽章演算法 + 金鑰」。
對稱加密 (HMAC):HS256
常見,簽發與驗證用同一把密鑰。
風險是如果密鑰外洩,任何人都能簽 Token。
非對稱加密 (RSA / ECDSA):RS256
常見,私鑰簽發,公鑰驗證。
可以公開驗證,不怕公鑰外洩,但私鑰必須嚴格保護。
實務建議:
JWT 最大的風險就是「一旦簽發就不可撤銷」。
所以 過期時間 (exp) 的設定非常重要。
案例
如果 Access Token 設定 7 天,那麼一旦外洩,攻擊者就有 7 天完全自由使用。
→ 所以才要搭配 Refresh Token,把 Access Token 壽命壓短。
JWT Payload 是 Base64Url 編碼,不是加密。任何人拿到 Token 都能解碼看到裡面的資料。
這邊先來說明一下錯誤的作法跟建議的做法。
錯誤做法:
{
"username": "eric",
"role": "admin",
"creditCard": "4111-1111-1111-1111"
}
建議做法:
Authorization Header:Authorization: Bearer <token>
→ 避免存放在 localStorage
(容易被 XSS 攻擊)。
HttpOnly Cookie:把 Token 存在 HttpOnly + Secure Cookie,比較不怕 XSS,但要注意 CSRF。
防禦建議:
HttpOnly
(JS 讀不到)Secure
(只在 HTTPS 傳送)SameSite=Lax/Strict
(防止 CSRF)現在的資安有很多弱點攻擊,這也是許多人不敢使用雲端的原因,就怕一個不小心就讓資料外洩。我們自己在開發雲端程式的時候,也需要針對這些常見攻擊來進行防護。
我整理了以下幾點比較常見的JWT的攻擊給大家參考。
早期有些 JWT 函式庫會允許 alg=none
或從 HS256 切到 RS256 ,這個就容易被攻擊者利用。
防禦方法:
alg
。攻擊者竊取了一張合法 Token,再重複使用。
防禦方法:
防禦方法:
如果後端沒有檢查 exp,就會讓過期 Token 繼續通過。
防禦方法:
JWT 本身是無狀態的,但實務上還是要有「可控性」。
tokenVersion
,使用者密碼改變或登出時版本升級 → 舊 Token 自動失效)。安全不只是技術設計,也要有 **觀測能力,**簡單來說,我們需要更多的log。
JWT 在正確使用下是非常好用的工具,但有幾個安全性要點必須遵守:
希望這些整理出來的資料會對大家有幫助,在開發JWT相關的程式時,可以先看看這個頁面,讓自己多加幾道防護。
所有關於JWT的知識就到這裡了,明天我們會來到新的篇章,就是更加近代的OAuth了。
那今天的教學就到這裡,我們明天見!