上一篇的最後提到 OAuth 2.0 其實是一個「授權框架」,而不是「驗證方法」。這句話聽起來像文字遊戲,但搞懂它,才能理解接下來要拆解的各種 Grant Type,到底在解決什麼問題。這篇先把 OAuth 2.0 最基礎的角色、流程與權限範圍講清楚,作為後續 Grant Type 的共同基礎。
實務上你也會看到很多文章把 Grant Type 稱為 OAuth Flow,例如 Authorization Code Flow、Implicit Flow、Device Flow。嚴格說起來,Grant Type 指的是 Client 取得 Access Token 的授權方式;Flow 則比較像是這個授權方式實際跑起來的流程。多數文章會混用這兩個詞,這篇後面也會視語境交替使用。
今天內容涵蓋:
RFC 6749 在 1.1 節開頭就定義了 OAuth 2.0 的四個角色,少了任何一個,整個授權流程都無法成立:
| 角色 | 說明 | 舉例 |
|---|---|---|
| Resource Owner(資源擁有者) | 通常就是使用者本人,擁有受保護資源的存取權 | 你自己,正在登入的那個人 |
| Client(客戶端) | 想要存取資源擁有者資料的第三方應用程式 | 想讀你 Google 日曆的待辦事項 App |
| Authorization Server(授權伺服器) | 驗證資源擁有者身分、取得同意後,簽發 Access Token 的伺服器 | Google 的 OAuth 伺服器 |
| Resource Server(資源伺服器) | 實際存放受保護資源、提供 API 的伺服器 | Google Calendar API |
💡Authorization Server 跟 Resource Server 可以是同一台伺服器,也可以是分開的兩個系統;一個 Authorization Server 簽發的 Access Token,也可以被多個 Resource Server 接受。
RFC 6749 對 Client 還有一層更細的分類,這層分類會直接決定 Client 能用哪種 Grant Type:
| 類型 | 特性 | 常見例子 |
|---|---|---|
| Public Client(公開客戶端) | 沒辦法安全保存 client_secret——因為程式碼或執行環境本身就在使用者端,隨時可能被拆解或攔截 | SPA、Mobile App、桌面應用程式 |
| Confidential Client(機密客戶端) | 可以把 client_secret 安全存放在使用者接觸不到的地方 | Web 後端伺服器、Backend Service |
這個分類直接影響安全性設計:
⚠️Mobile App、桌面應用程式雖然理論上有系統層級的安全儲存機制(例如 Keychain),但大多數框架仍把它們歸類為 Public Client——因為它們會被發佈、安裝到使用者的裝置上,預設「使用者端拿得到裡面的東西」是比較安全的假設。
RFC 6749 可以用一張圖把四個角色的互動關係畫出來:

六個步驟拆開來看:
scope)、授權完成後要導回哪裡(redirect_uri)等資訊。💡技術上,Resource Owner 可以只同意部分權限、也能隨時撤回;法規上,GDPR(歐盟資料保護法規)等資料隱私法規也要求必須取得明確同意。這就是為什麼 Authorization Server 一定要有清楚的同意畫面——而同意的具體內容,就是後面第四節會談到的 Scope。
這裡要先建立一個概念:「Authorization Grant」跟「Access Token」不是同一個東西。Authorization Grant 是 Client 用來向 Authorization Server 證明「我已經取得授權,可以來換 Access Token」的憑證或依據;Access Token 才是實際拿去呼叫 Resource Server 的憑證。
後面要介紹的 Authorization Code、Implicit、Resource Owner Password Credentials、Client Credentials,都是 RFC 6749 定義的不同 Grant Type,差別主要在於 Client 如何取得授權、Access Token 如何被核發。實際流程不一定會完整照著這張抽象圖的六個步驟逐一發生,但這個架構概念本身沒有變。
⚠️RFC 6749 雖然列出 Implicit 跟 Resource Owner Password Credentials 這兩種 Grant Type,但在後來的 RFC 9700(OAuth 2.0 Security Best Current Practice)中都已不被建議使用,具體原因與取代方案會在 之後分別展開。
OAuth 2.0 沒有規定 Resource Server 要長什麼樣子,也沒有規定資源要怎麼切分。這件事通常靠 Scope 參數來表達:Client 在請求裡帶上 Scope,說明「我想要哪些權限」,Authorization Server 跟 Resource Server 再依照共同約定好的值決定是否放行。
OAuth 2.0 沒有規定 Scope 字串要怎麼寫,不同 Authorization Server 會有自己的寫法(也就是命名慣例),常見的有:
| 慣例 | 範例 | 意思 |
|---|---|---|
| 只用動作 | read、write |
只說「能做什麼動作」,沒指定要用在哪個資源上,範圍最簼統 |
[動作]:[資源] |
read:orders、write:profile |
明確寫出「对哪個資源做什麼動作」,比只用動作更精確 |
[URI]:[動作] |
https://api.example.com/orders:read |
直接用完整網址當資源識別,常見於需要跨服務、跨網域區分資源的情境 |
以上面 [動作]:[資源] 的 read:orders 為例,下圖實際畫出 User、Client、Authorization Server、Resource Server 四方如何靠 Scope 來協調權限:

💡Scope 的實際命名跟意義,OAuth 2.0 本身不規定,需要 Client、Authorization Server、Resource Server 三方自己約定好。到了 OIDC,才有 openid、profile、email 這種標準化的 Scope,這部分會在後面 OIDC 的章節提到。
這一節要說明的核心概念是:OAuth 2.0 要回答的是「這個 App 可以存取什麼?」(Authorization,授權),而不是「這個使用者是誰?」(Authentication,驗證)。
實務上容易搞混,是因為 Authorization Server 在發 Access Token 之前,通常會先驗證 Resource Owner 的身分。這個前置動作讓很多人誤以為拿到 Access Token 就等於「使用者已經登入驗證成功」;但 Access Token 本質上是「這個 App 有沒有權限」的證明,不是用來代表使用者身分的憑證。
也就是說,OAuth 2.0 流程中確實常常會出現登入畫面,但登入只是 Authorization Server 確認 Resource Owner 身分、取得授權同意的前置步驟;整個 OAuth 2.0 流程真正產出的核心結果,仍然是 Access Token,而不是用來代表登入身份的 ID Token。
真正要解決「這個使用者是誰」的問題,靠的是建立在 OAuth 2.0 之上的 OpenID Connect(OIDC)。OIDC 會額外多發一個 ID Token,裡面才有使用者身分的宣告;這部分會在之後深入拆解。
💡這個混淆不是巧合,因為機制上兩者本來就是共用的:OIDC 的 Authentication Request,其實就是在 Authorization Request 的基礎上,多要求「順便驗證使用者身分」而已,具體怎麼做會在後面 OIDC 的章節詳細說明。也因為兩者共用同一套請求機制,Authorization 跟 Authentication 這兩個詞,實務上才會常常被搞混。
RFC 6749 原始只定義了 4 種 Grant Type:
但十幾年下來,隨著裝置型態變多、安全事件累積,社群也依據 RFC 6749 8.3 節預留的擴充機制,陸續推出新的 Extension Grant,例如 Device Authorization Grant、JWT Bearer Grant、SAML 2.0 Bearer、Token Exchange;同時,幾種舊流程也被正式列為不建議使用。
如果只看新系統的常見選擇,可以先抓住兩個大方向:有使用者參與時,優先使用 Authorization Code + PKCE;沒有使用者參與、純服務對服務時,使用 Client Credentials。其他 Grant Type 大多是為了特殊裝置、企業整合或歷史相容性而存在。
到了 2026 年,實務上大致可以整理成:
| Flow / grant_type | 分類 | 目前建議狀態 | 常見用途 |
|---|---|---|---|
| Authorization Code + PKCE | 核心 Grant Type | ✅ 最推薦 | Web、SPA、Mobile App、一般使用者登入授權 |
| Client Credentials | 核心 Grant Type | ✅ 推薦 | Server-to-Server、Machine-to-Machine |
| Device Authorization Grant 擴展機制 | 擴展機制(RFC 8628) | ✅ 推薦 | Smart TV、遊戲機、CLI、輸入能力有限的裝置 |
| Refresh Token | — | ✅ 常用,但不是獨立登入流程 | 更新 Access Token |
| JWT Bearer 擴展機制 | 擴展機制(RFC 7523) | ✅ 特殊用途 | Server、企業整合、Service Account 類場景 |
| SAML 2.0 Bearer 擴展機制 | 擴展機制(RFC 7522) | ✅ 特殊用途 | 企業 SSO / 舊系統與 OAuth 整合 |
| Token Exchange 擴展機制 | 擴展機制(RFC 8693) | ✅ 特殊用途 | 微服務委派鏈、Workload Identity Federation、跨網域換票 |
| Implicit Grant | 核心 Grant Type(已淘汰) | ⚠️ 已不建議 | 舊 SPA |
| Resource Owner Password Credentials | 核心 Grant Type(已禁用) | ❌ 禁止新系統使用 | 舊系統直接拿帳密換 Token |
💡這張表不是單一官方文件的排行榜,而是綜合 RFC 9700(OAuth 2.0 Security Best Current Practice)明確禁用 Resource Owner Password Credentials、不建議 Implicit 的立場,加上 OAuth 2.1 草案將 Authorization Code + PKCE 訂為預設流程的走向,以及目前業界對其他 Grant Type 的普遍用法整理而成,並非某個官方年度評級。
這篇先把 OAuth 2.0 的基礎架構整理起來。要看懂後面的各種 Grant Type,最重要的是先抓住幾個概念:
下一篇會從最常見的 Authorization Code Grant 開始,實際看使用者授權第三方 App 時,OAuth 2.0 如何透過「先拿 Code、再換 Token」的方式降低 Access Token 直接暴露的風險。