發了 token 不是結束,是風險的開始。短命 access token + refresh token + 可撤銷是把「洩漏」的傷害縮到最小的標準組合;再加一串 OAuth 伺服器加固,才擋得住 CSRF、釣魚與點擊劫持。
🧠 Core Ideas
TIP
核心直覺:假設 token 遲早會外洩,所以讓它短命 + 可換 + 可撤。短命 access token 洩漏只在過期前有效;refresh token 沒有 client secret 也用不了。
- Access token 通常數小時/數天過期——洩漏影響有限。
- Refresh token:用 client ID + secret + refresh token 換新的 access token,不必重新登入。
- 使用者要能看見並撤銷哪些 app 有存取權(授權管理頁 + 程式化撤銷 API)。
⚖️ Tradeoffs
為什麼短命 token 更安全
- access token 洩漏 → 僅過期前有效。
- refresh token 洩漏但沒 client secret → 用不了;兩者都洩 → 因 refresh 常為一次性,可偵測異常。
- 教訓:Slack 早期長命 token 被開發者硬編碼、甚至誤傳到 GitHub → Slack 寫爬蟲掃 GitHub 上的 token 自動撤銷,並改用短命 token。
OAuth 伺服器加固清單
- state 參數防 CSRF;authorization code 短命且一次性。
- 強制 HTTPS 防中間人;驗證 redirect URL 必須與註冊值相符。
- 禁止 iframe 渲染授權畫面(
X-Frame-Options)防點擊劫持。 - client secret 可重設(洩漏能輪換);敏感資料用專用 scope;新授權通知使用者;禁誤導性 app 名稱防釣魚(曾有假「Google Docs」釣走百萬帳號)。
Token 缺 scope 時的回應
- 驗證失敗時回詳細錯誤:附上「已提供的 scope」與「所需的 scope」,大幅省下開發者除錯時間(Slack 就這麼做)。
🔑 Takeaways
- 預設 token 會外洩:短命 access + refresh + 可撤銷是把傷害最小化的標準組合。
- OAuth 伺服器加固要成套:state 防 CSRF、HTTPS、驗 redirect、禁 iframe、可輪換 secret。
- 讓使用者看得到、撤得掉授權;權限不足時回帶 scope 細節的錯誤。
No notes yet — jot your takeaways or Q&A here.