昨天已經用簡單的方式介紹過 FIDO2、WebAuthn 與 CTAP 的基本分工。今天不再重複「三者分別是什麼」,而是往下一層拆解它們實際如何合作。
本文會從 WebAuthn 的註冊與登入請求開始,說明瀏覽器如何把操作交給內建或外部 Authenticator;使用外部 Authenticator 時,CTAP 又如何透過 USB、NFC、BLE 或 Hybrid Transport 傳遞指令。最後再說明不同 Authenticator 類型,以及 Attestation 在註冊流程中的作用。
因此,本文將以 Day19 所介紹的 Passkey 登入流程為基礎,進一步說明 FIDO2、WebAuthn、CTAP 與 Authenticator 在實際運作中的分工與互動。
今天內容涵蓋:
一次 FIDO2 認證會從 Relying Party 發出請求,經由 WebAuthn 進入 Client;接下來是否使用 CTAP,則取決於選擇的是內建或外部 Authenticator。內建 Authenticator 通常由作業系統透過平台介面操作;安全金鑰或另一台手機等外部 Authenticator,才會透過 CTAP 溝通。完成建立憑證或簽章後,結果再經由 WebAuthn 回到 Relying Party。

對照上圖,整體架構可以分成三個部分:
除了上述三個主要區域,圖中的服務端下方還標示了「FIDO Server(Metadata)」。這表示服務端可以視需要取得 Authenticator 的 Metadata;實際提供這些資料的是 FIDO Metadata Service(MDS),內容包括 Authenticator 的型號、認證狀態與安全資訊。Relying Party 通常只會在註冊或政策檢查時查詢,一般 Passkey 登入不一定會使用此服務。
在主要認證路徑中,網站與 Client 之間都由 WebAuthn 負責傳遞標準請求與回應;只有在使用外部 Authenticator 時,Client 才需要再透過 CTAP 與該裝置溝通。
昨天已從使用者角度說明 Passkey 的註冊與登入流程;本節改從網站開發者的角度,整理 WebAuthn 在 Relying Party 與 Client 之間定義的介面與資料邊界。
在瀏覽器環境中,開發者最常接觸以下兩個 API:
| API | 使用時機 | 網站提供的主要資料 | 回傳結果 |
|---|---|---|---|
navigator.credentials.create() |
註冊新的 Passkey | Challenge、RP 與使用者資料、Authenticator 條件 | 公開金鑰、credential ID 與 Attestation 相關資料 |
navigator.credentials.get() |
使用既有 Passkey 登入 | Challenge、RP ID、可使用的憑證及使用者驗證條件 | credential ID、簽章與 Authenticator 資料 |
WebAuthn 主要定義以下三項內容:
瀏覽器完成介面與網站來源檢查後,服務端仍須驗證 Challenge、Origin、RP ID 與簽章,才能接受註冊或登入結果。
💡WebAuthn 本身不保存私密金鑰,也不負責執行簽章;這些工作由 Authenticator 完成。網站只需要透過 WebAuthn 提出註冊或登入要求,後續由瀏覽器與作業系統決定如何操作對應的 Authenticator。
CTAP 不是提供給網站直接呼叫的 API,而是瀏覽器/作業系統用來操作外部 Authenticator 的通訊協定。當 WebAuthn 請求抵達 Client,且使用者選擇安全金鑰或另一台手機時,Client 才會把相應動作轉成 CTAP 指令。
本文所稱的 CTAP 主要指 CTAP2,也是目前 FIDO2 與 Passkey 使用的版本。
WebAuthn 與 CTAP2 的主要動作可以這樣對照:
| WebAuthn 動作 | CTAP2 常見指令 | Authenticator 執行的工作 |
|---|---|---|
| 建立憑證 | authenticatorMakeCredential |
建立新的金鑰與憑證資料 |
| 使用憑證 | authenticatorGetAssertion |
找到既有憑證並使用私密金鑰產生簽章 |
CTAP 指令可以透過不同方式傳送,實際採用哪一種方式,取決於 Authenticator 與 Client 支援的能力:
| 傳輸方式 | 常見使用情境 |
|---|---|
| USB | 將實體安全金鑰插入電腦 |
| NFC | 使用手機或電腦感應安全金鑰 |
| BLE | 與支援藍牙的外部 Authenticator 溝通 |
| Hybrid Transport | 手機掃描電腦上的 QR Code,BLE 用來確認兩台裝置位於附近,加密網路通道則負責傳遞 CTAP 資料 |
網站開發者不需要分別撰寫「使用 Windows Hello」、「讀取 USB 安全金鑰」或「連接手機」的程式,只要呼叫 WebAuthn。接著要使用哪一個 Authenticator,以及透過平台介面、USB、NFC、BLE 或 Hybrid Transport 連接,會由瀏覽器與作業系統處理。
Authenticator 是實際保存或使用 Passkey 私密金鑰,並負責建立金鑰與產生簽章的元件。它可能位於目前使用的裝置中,也可能是另外連接的安全金鑰或手機。
Platform 與 Roaming 的分類,描述的是 Authenticator 和「目前正在登入的裝置」之間的關係:
| 類型 | 簡單理解 | 常見例子 | 如何連接 |
|---|---|---|---|
| Platform Authenticator | Authenticator 就在目前裝置中 | Windows Hello、Mac 的 Touch ID、Android 裝置鎖定 | 由作業系統透過平台內部介面操作,通常不需要 CTAP |
| Roaming Authenticator | Authenticator 位於目前裝置之外 | USB/NFC 安全金鑰、另一台保存 Passkey 的手機 | 透過 CTAP,搭配 USB、NFC、BLE 或 Hybrid Transport 連接 |
例如,在 Mac 上直接使用 Touch ID 登入時,使用的是 Platform Authenticator;若在電腦上掃描 QR Code,改用手機裡的 Passkey 登入,手機就是外部的 Roaming Authenticator。
這兩種分類看的是「這次登入時,Authenticator 位於哪裡」,不是看 Passkey 從哪裡同步而來。
一般 Passkey 登入只需要確認簽章是否正確,不必知道使用者使用哪一種裝置。但在企業或高安全需求環境中,Relying Party 可能還要確認「這組憑證是不是由核准的 Authenticator 建立」,這就是 Attestation 的用途。
可將 Attestation 理解為 Authenticator 在註冊時提供的裝置來源證明。它可以協助確認 Authenticator 的廠商、型號或認證狀態,但不能用來證明使用者本人是誰。
| 設定 | 代表意思 | 常見情境 |
|---|---|---|
| None | 不要求 Authenticator 提供可識別的來源資訊 | 一般網站最常使用,重視隱私與相容性 |
| Direct/Indirect | 要求取得 Authenticator 的來源或認證資訊 | 需要檢查安全金鑰類型或認證狀態的服務 |
| Enterprise | 允許企業環境取得較明確的 Authenticator 資訊 | 公司限制員工只能使用核准裝置的情境 |
例如,公司若規定員工只能使用特定型號的安全金鑰,便可在註冊時取得 Attestation,並搭配第一節提到的 FIDO Metadata Service(MDS)檢查該型號是否符合政策。一般網站若只在意 Passkey 能否正確完成簽章,通常不需要要求 Attestation。
FIDO2、WebAuthn 與 CTAP 的關係可以整理成以下重點:
下一篇將先介紹 Authentication(認證)與 Authorization(授權)的差異,釐清「確認使用者是誰」與「決定使用者可以做什麼」這兩個階段。之後再依序介紹 RBAC、ABAC、ACL 與 ReBAC 等存取控制模型。