今天要看的 Implicit Grant,是 OAuth 2.0 核心規格(RFC 6749)裡四種基本 Grant Type 之一,也是目前官方明確建議不再使用的流程。它當年被設計出來,是為了解決純前端應用(像 SPA、一些原生 App)沒有安全地方保存 client_secret 的問題。不過,Implicit Grant 會直接透過瀏覽器 URL 回傳 Access Token,因此更容易在前端流程中外洩或遭到注入。為降低這些風險,RFC 9700 建議改用 Authorization Code Grant 搭配 PKCE;OAuth 2.1 草案也未再納入 Implicit Grant。
今天內容涵蓋:
Implicit Grant 是 OAuth 2.0 中一種直接核發 Access Token 的授權方式。使用者完成登入與授權後,Authorization Server 不會先回傳 Authorization Code,而是將 Access Token 放在 redirect_uri 的 URL Fragment 中,透過瀏覽器重新導向交給 Client。
這個流程最大的特徵,是省略了向 Token 端點交換 Authorization Code 的步驟。Client 在授權請求中使用 response_type=token,收到 Access Token 後便能直接呼叫 API,因此不需要後端參與。
Implicit Grant 當初主要是為了瀏覽器中的公開客戶端(Public Client)而設計,例如所有程式碼都執行於前端的 SPA。在 RFC 6749 發布時,瀏覽器直接呼叫 Token 端點的做法也尚未普及,因此直接回傳 Access Token 能降低實作門檻。不過,這也使 Token 必須經過瀏覽器前端,成為後續安全風險的來源。
Implicit Grant 省略了 Token 端點的交換步驟。下圖先呈現完整流程,再依序說明每個步驟:

對照上圖,流程如下:
/authorize 端點,並帶上 response_type=token、client_id、redirect_uri、scope 與 state。redirect_uri 的 URL Fragment(#)中,透過瀏覽器重新導向回傳給 SPA。Authorization Header 中攜帶 Access Token,呼叫 Resource Server 的 API。圖中下半部的 a~c 是過去常見的「靜默重新授權(Silent Re-auth)」做法:Access Token 過期後,SPA 透過隱藏的授權請求,嘗試利用既有的瀏覽器 Session 取得新 Token。這不是 Implicit Grant 的必要步驟,而是早期用來補足「不能核發 Refresh Token」限制的替代方式。
Client 將瀏覽器導向 Authorization Server 時,會送出以下請求:
GET /authorize?response_type=token&client_id=abc123&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback&scope=read&state=xyz HTTP/1.1
Host: as.example.com
| 參數 | 說明 |
|---|---|
response_type |
固定填 token,表示要使用 Implicit Grant,並直接在授權回應中取得 Access Token |
client_id |
Client 註冊時取得的公開識別碼,讓 Authorization Server 知道是哪個應用程式發起請求 |
redirect_uri |
授權完成後要將瀏覽器導回的網址,必須符合 Client 預先註冊的回呼網址 |
scope |
Client 要求的權限範圍,例如範例中的 read |
state |
Client 產生的隨機值,用來對應授權請求與回應;回傳後必須比對,以協助防止 CSRF 攻擊 |
使用者完成登入與授權後,Authorization Server 透過重新導向回傳以下結果:
HTTP/1.1 302 Found
Location: https://app.example.com/callback#access_token=2YotnFZFEjr1zCsicMWpAA&token_type=Bearer&expires_in=3600&state=xyz
| 參數 | 說明 |
|---|---|
access_token |
Client 用來呼叫 Resource Server/API 的存取憑證 |
token_type |
Token 的使用方式;Bearer 表示持有 Token 即可使用 |
expires_in |
Access Token 的有效時間,單位為秒;範例中的 3600 代表一小時 |
state |
Authorization Server 原樣回傳的值,Client 必須確認它與原始請求中的 state 一致 |
需要注意的是,RFC 6749 第 4.2.2 節規定 Authorization Server 不得在 Implicit Grant 中核發 Refresh Token;Access Token 過期後,Client 必須重新執行授權流程取得新的 Token。
Implicit Grant 的核心問題,在於 Authorization Server 直接透過瀏覽器重新導向回傳 Access Token。這種做法雖然省略了 Code 交換,卻也讓 Token 更容易暴露在前端環境中。
| 比較項目 | Authorization Code + PKCE | Implicit Grant |
|---|---|---|
response_type |
code |
token |
| Authorization Server 先回傳 | 一次性的 Authorization Code | Access Token |
| Access Token 的取得方式 | Client 使用 Code 與 code_verifier 向 Token 端點交換 |
直接附加在重新導向 URL 的 Fragment 中 |
| 是否能使用 PKCE | 可以 | 不行,因為沒有 Code 交換步驟 |
| 是否可核發 Refresh Token | 可依 Authorization Server 的政策核發 | RFC 6749 明確禁止 |
| 瀏覽器 URL 中的內容 | 一次性的 Code | 可直接呼叫 API 的 Access Token |
SPA 與原生 App 的程式都執行在使用者裝置上,寫在程式裡的 client_secret 容易被查看或反編譯取得,因此不能可靠地證明 Client 身分。不過,這類 Client 仍可使用 Authorization Code + PKCE:Authorization Server 會先回傳一次性的 Authorization Code,再由 Client 搭配 PKCE 交換 Access Token。
code_verifier 將授權結果綁定到原本發起請求的 Client。⚠️ 現行建議: RFC 9700 建議一般情況改用
response_type=code,OAuth 2.1 草案也未再納入 Implicit Grant。因此,SPA 與原生 App 應採用 Authorization Code + PKCE;新系統不應再使用 Implicit Grant,既有系統則應規劃遷移。
Implicit Grant 的核心,是讓 Authorization Server 在使用者完成登入與授權後,直接透過 redirect_uri 的 URL Fragment 回傳 Access Token。這種設計降低了早期瀏覽器公開客戶端的實作門檻,卻也使 Access Token 必須直接經過瀏覽器前端。
本文可以整理成三個重點:
response_type=token 發起授權,Authorization Server 直接在授權回應中核發 Access Token。下一篇將介紹 ROPC(Resource Owner Password Credentials)。Implicit Grant 的問題在於直接透過瀏覽器回傳 Access Token;ROPC 的問題則是要求使用者將帳號密碼直接交給 Client,兩者面臨的安全風險並不相同。