KeyFrame內部研究專用

Most Devs Get API Authentication Wrong ?

CsMadeEz·4月21日週二·14 min中文

三句話摘要

系統性比較 Basic Auth、Bearer Token 與 JWT 三種 API 認證方式的原理、優缺點與適用場景。 認證方案沒有最好只有最適合:內部工具用 Basic Auth、公開 API 用 JWT 搭配 Refresh Token 模式、單機 Web App 用 Opaque Token,匹配真實需求而非追求最新趨勢,才是工程師該做的判斷。 HTTP 無狀態是認證問題的根源。 每個 HTTP 請求彼此獨立,伺服器沒有記憶,因此每次請求都必須攜帶身份證明,而不同的認證方案本質上是在解決「怎麼每次都証明自己是誰」這個問題。

重點整理

重點
  • 1

    HTTP 無狀態是認證問題的根源。 每個 HTTP 請求彼此獨立,伺服器沒有記憶,因此每次請求都必須攜帶身份證明,而不同的認證方案本質上是在解決「怎麼每次都証明自己是誰」這個問題。

  • 2

    Basic Auth 的安全性完全依賴 HTTPS。 Base64 是編碼而非加密,任何人都能解碼;有了 HTTPS 整條連線加密,Base64 內容才不會被截取。它夠簡單、適合 CI/CD 或內部服務,但每次請求都帶帳密,暴露面積大,不適合公開 API。

  • 3

    JWT 以數學驗簽取代資料庫查詢,但代價是無法即時撤銷。 JWT 的 Signature 由 Header + Payload 加密簽出,任何篡改都會讓驗證失敗;服務器只需運算就能驗證,不用連資料庫,天然橫向擴展。但 token 一旦發出就活在客戶端,即使帳號被盜也要等到過期才失效。

  • 4

    Refresh Token 模式是實務上的最佳平衡。 發兩個 token:短效 JWT(15 分鐘)用於每次 API 請求,長效 Opaque Token(7 天)存在資料庫,只用來換新的 JWT。兩者組合兼顧速度與可撤銷性。

實用技巧與重點

乾貨
  • 具體數字與時間:
  • Access Token 建議存活時間:15 分鐘
  • Refresh Token 建議存活時間:7 天
  • JWT 過期越短,被盜後的風險窗口越小
  • 工具 / 函式庫名稱:
  • Node.js:`jsonwebtoken`
  • Python:`PyJWT`
  • Java:`java-jwt`
  • 快取方案:Redis(用於共享 Opaque Token 狀態)
  • JWT 三段結構:
  • Header:`alg`(演算法)+ `typ`(類型 = JWT)
  • Payload:`sub`(Subject/用戶ID)、`iat`(IssuedAt)、`exp`(Expiration)+自定義欄位(Role、Permissions)
  • Signature:Base64(Header) + "." + Base64(Payload) 用密鑰加密後的結果
  • 簽名演算法:
  • 對稱式:HMAC-SHA256(同一把 secret 簽發與驗證,適合單一伺服器)
  • 非對稱式:RS256(private key 簽發,public key 驗證,適合微服務)
  • 5 條不可談判安全原則:
  • 永遠用 HTTPS,無例外
  • Token 存 HTTPOnly Cookie,而非 localStorage;加 `SameSite=Strict` 防 CSRF
  • Access Token 短效(15 分鐘),縮小被盜風險窗口
  • 使用經過大量審計的成熟函式庫,不要自己實作加密
  • 驗證 JWT 時必須白名單指定允許的演算法(防止 `alg: none` 攻擊)
  • 選型速查:
  • | 場景 | 方案 |
  • |------|------|
  • | 內部工具、CI/CD | Basic Auth over HTTPS |
  • | 公開 API、多伺服器 | JWT(Stateless,橫向擴展) |
  • | 單台伺服器的 Web App | Opaque Bearer Token + Session |

結論

結論

認證方案沒有最好只有最適合:內部工具用 Basic Auth、公開 API 用 JWT 搭配 Refresh Token 模式、單機 Web App 用 Opaque Token,匹配真實需求而非追求最新趨勢,才是工程師該做的判斷。

完整解析

詳細

Web API 認證的本質問題源自 HTTP 的無狀態性。HTTP 協議中每一個請求都是獨立事件,伺服器沒有任何記憶,這意味著用戶在第一個請求中驗證了身份,到了第二個請求(哪怕只隔半秒)伺服器一樣不認識你。認證(Authentication)要解決的是「你是誰」的問題,而授權(Authorization)是在「你已確認身份」之後才問「你能做什麼」。這兩件事順序固定,不可顛倒,而本影片聚焦在前者:如何在 HTTP 無狀態的前提下,每次請求都能可靠地証明身份。

最早的解法是 Basic Auth:將 username 與 password 用冒號拼接,再以 Base64 編碼後放進每個請求的 HTTP Header。重要的是,Base64 是「編碼」不是「加密」,任何人拿到字串都能秒解碼。因此 Basic Auth 的安全性完全依賴 HTTPS——HTTPS 將整條連線加密,外人根本碰不到那個可被解碼的字串。這個方案夠簡單、部署快、適合 CI/CD pipeline 或只有少數信任方使用的內部服務;但它的致命缺點是每次請求都帶上帳密,每次都是一次可能出錯的機會,因此公開 API 不適合使用。

Opaque Bearer Token 改善了這一點:用戶只在登入時傳一次帳密,伺服器驗證後回傳一個隨機字串(token),後續所有請求只帶這個 token 即可。概念上就像音樂節的手環——入場驗票一次,之後憑手環進出,不用每次再拿票。然而 Opaque Token 本身沒有任何語意,只是一串隨機字元,伺服器收到後必須去資料庫查詢「這個 token 屬於誰、有什麼權限」。單機架構下這沒問題,但當服務水平擴展成多個節點時,所有節點都需要共享同一個 token 資料庫或 Redis Cache,架構複雜度隨節點數線性增長。

JWT(JSON Web Token)正是為了解決這個擴展問題而生。JWT 由三段組成:Header(聲明演算法與 token 類型)、Payload(攜帶用戶 ID、角色、過期時間等聲明)、Signature(對前兩段做加密簽名)。伺服器收到 JWT 後只需用密鑰做數學運算驗證簽名,無需查詢任何資料庫。一旦簽名驗証通過,Payload 中的所有信息即可直接信任使用。這使得任何持有相同 secret(或 public key)的服務器都能獨立驗證 token,天然支持橫向擴展。但 JWT 有個根本限制:token 不存在伺服器端,一旦發出就活在客戶端,即使帳號被盜也無法即時撤銷,只能等到 token 自然過期。這也是為何 JWT 的過期時間必須短,建議 15 分鐘。

短效 token 帶來新問題:用戶豈不是要每 15 分鐘登入一次?解法是 Refresh Token 模式:同時發出兩個 token,短效 JWT(15 分鐘)用於每次 API 請求,長效 Opaque Refresh Token(7 天)存在資料庫,只在 Access Token 過期時用來靜默換新 JWT。這樣用戶無感,但長效 token 因為存在資料庫,隨時可以撤銷。在演算法選擇上,單一伺服器使用對稱式 HMAC-SHA256 即可;微服務架構則應採用非對稱式 RS256,Auth Server 持有 private key 簽發 token,其餘服務只需 public key 驗證,private key 永不外流。最後,安全上還需防範 `alg: none` 攻擊——攻擊者將 Header 中的演算法改為 `none`,讓伺服器跳過驗証;防禦方法是在驗証邏輯中明確白名單指定可接受的演算法(如只允許 RS256),一行設定即可徹底封堵。

關鍵時刻

Pipeline v2

帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。

事實查核

Pipeline v2

說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

更多「Web2 安全」的內容

SANS Stormcast Tuesday, August 25th, 2026: DOUBLECUP PNG; WebAudio Fingerprinting; Expired Domains; Android; Car
7 min
Web2 安全英文PODCAST8月25日

SANS Stormcast Tuesday, August 25th, 2026: DOUBLECUP PNG; WebAudio Fingerprinting; Expired Domains; Android; Car

SANS Stormcast

  • PNG 容器攻擊的簡易性設計:Double Cup 不依賴複雜的 Exif 或隱寫技術,只用 PNG 副檔名和檔頭來偽裝,核心是利用 findstr 指令的常見可用性讓執行變得無需額外工具。
  • Web Audio API 的隱密指紋識別:音訊於增益零的無聲狀態下播放,使用者完全無感,但錄製波形足以建立裝置特徵,在瀏覽器原生功能層面難以區分是反詐欺還是過度追蹤。
  • 域名過期引發的串聯漏洞:DMARC 報告端點使用過期域名是常見疏漏,允許攻擊者透過簡單的域名註冊取得他人的 SPF/DKIM 錯誤報告,進而收集目標系統配置情報。
Risky Bulletin: Expired credit cards can be used for malicious transactions
5 min
Web2 安全英文PODCAST8月24日

Risky Bulletin: Expired credit cards can be used for malicious transactions

Risky Business

  • 支付安全的非對稱風險:Visa卡利用未加密的卡片資料與NFC通訊,攻擊者可藉由中間人技術竄改過期日期進行交易,但MasterCard、美運卡與Discover的防護更完善,顯示不同發卡機構的安全架構存在明顯差異。
  • 國家級駭客活動的連鎖延伸:北韓Lazarus集團在2月單一事件已累積100名受害者,涵蓋大學、警察部門、媒體與醫療機構,伊朗駭客則針對基礎建設如電力系統發動破壞性攻擊,反映地緣政治在網路戰爭中的升溫。
  • AI加速漏洞生態的雙面刃:AI工具催生近2萬份漏洞概念驗證代碼發布,但同時也導致大量失效漏洞代碼氾濫,增加資安團隊甄別真實威脅的難度;Mayer Protocol遭攻擊事件中,駭客用AI鏈接六個無關的小漏洞完成盜竊170萬美元的攻擊。
SANS Stormcast Monday, August 24th, 2026: More Entra Powershell; Entra Vulnerability; GitLab Vuln (and PoC); GTA 6 Leak Malware
5 min
Web2 安全英文PODCAST8月24日

SANS Stormcast Monday, August 24th, 2026: More Entra Powershell; Entra Vulnerability; GitLab Vuln (and PoC); GTA 6 Leak Malware

SANS Stormcast

  • Microsoft EntraID 的遠端代碼執行漏洞已由微軟修補,初期報告顯示已遭利用但後來更正為未遭利用。這反映 Microsoft 在雲端軟體安全上的透明度提升,對漏洞採用與內部軟體相同的 CVE 編號和公告流程。
  • PowerShell 指令碼可用於驗證 MFA 部署完整性,特別是找出未啟用 MFA 的遺漏帳號。同時可以分析 EntraID 登入日誌中的異常行為,如風險係數評估和地理位置檢測,幫助組織快速識別可疑登入。
  • GitLab 的 GraphQL 代碼注入漏洞允許未認證攻擊者刪除或修改儲存庫,潛在導致供應鏈攻擊。已有公開概念驗證 (PoC) 存在,使用內部部署 GitLab 的組織必須立即修補。