# 當你點下「用 Google 登入」時,背後到底發生了什麼? 我記得第一次看到「用 Google 登入」按鈕的時候,心情其實很複雜。一方面覺得超方便,不用再想什麼密碼、不用填那堆重複的個人資料;但另一方面又有點不安 —— 欸,這個網站怎麼可能不知道我的 Google 密碼,卻能拿到我的資料呢? 這種感覺你懂的,就像是把家裡鑰匙給陌生人,但又不想真的給他主鑰匙的那種矛盾。後來我實在太好奇了,決定深入研究這背後的機制。這一研究不得了,發現了一個叫做 OAuth 的技術,而且這個技術的設計理念竟然跟我們生活中很常見的一個場景很像。  ## 代客泊車的頓悟時刻 那天我去一家高級餐廳吃飯,到了門口需要代客泊車。當代客人員伸手要我的車鑰匙時,我突然想到:「欸等等,我不會真的給他我的主鑰匙吧?」 果然,餐廳給的是一把特殊的「代客鑰匙」。這把鑰匙只能啟動車子和鎖車,但打不開後車廂、打不開手套箱,更不可能開我家的門。而且這把鑰匙還有時間限制,過了今晚就失效了。 就在那個瞬間,我突然恍然大悟:「這不就是 OAuth 嗎!」 Google 就像是你的主鑰匙,而那些第三方網站拿到的,其實是一把「代客鑰匙」—— 也就是 OAuth 裡面說的「存取令牌」(Access Token)。這把虛擬的鑰匙只能做特定的事情,比如讀取你的基本資料、看看你的 email 地址,但它絕對不能改你的 Google 密碼,也不能刪除你的 Gmail。 ## 我後來才發現的技術真相 當我開始深入研究 OAuth 時,發現這整個過程比我想像的還要精妙。你懂的,技術文件都寫得很抽象,什麼「授權伺服器」、「資源擁有者」,看得我頭都暈了。但當我把它對應到真實場景時,一切就變得清楚了。  整個流程其實很簡單,就像這樣: 當你點下「用 Google 登入」的那一刻,第三方網站(比如某個購物網站)會把你「推」到 Google 的授權頁面。注意,不是網站自己問你密碼,而是直接把你送到 Google 那裡。這就像代客服務員不會問你車子怎麼開,而是直接帶你到櫃台辦理代客手續。 在 Google 的頁面上,你會看到類似這樣的訊息:「某某購物網站想要存取你的基本資料,包括姓名和 email 地址,你同意嗎?」這時候你可以選擇同意或拒絕,就像選擇要不要使用代客服務一樣。 如果你點了同意,Google 會給你一個「授權碼」(Authorization Code)。這個授權碼就像代客服務的收據,它本身不是鑰匙,但可以用來換取真正的鑰匙。 接著購物網站會拿著這個授權碼,私下跟 Google 說:「欸,這個用戶同意讓我存取他的資料了,你看,我有收據。」Google 驗證無誤後,就會給網站一個「存取令牌」,也就是那把代客鑰匙。 最後,網站就可以用這個令牌去 Google 那裡取得你同意分享的資料。整個過程中,你的 Google 密碼從來沒有離開過 Google 的伺服器。 ## 版本演進的有趣故事 我研究這個技術的時候發現,OAuth 其實有個很有趣的發展歷程。最早的 OAuth 1.0 設計得超複雜,需要很多密碼學計算,搞得開發者都快瘋了。就像早期的代客服務需要一堆複雜的手續和簽名驗證一樣。 但是到了 OAuth 2.0,設計師們聰明多了。他們說:「既然現在所有的網路連線都用 HTTPS 加密了,我們何必搞那麼複雜?」於是大大簡化了整個流程,讓開發變得容易很多。 不過有趣的是,OAuth 還有個兄弟叫做 OpenID Connect。如果說 OAuth 解決的是「你能做什麼」的問題,那 OpenID Connect 解決的就是「你是誰」的問題。OAuth 讓網站知道它有權限存取你的某些資料,但 OpenID Connect 會額外告訴網站你的身份資訊。 這就像代客服務的升級版:不只給你一把限制功能的鑰匙,還會在鑰匙上標註車主的姓名,這樣你就能享受真正的「單點登入」體驗。 ## 安全考量:沒有想像中那麼簡單 剛開始我以為 OAuth 很安全,畢竟密碼都沒有外流嘛。但後來我才知道,魔鬼藏在細節裡。 2024 年就發生過不少 OAuth 相關的安全事件。有攻擊者會攔截那個授權碼,搶在真正的應用程式之前去兌換存取令牌。這就像有人偷走你的代客收據,然後冒充你去取車一樣。  為了解決這個問題,安全專家們發明了 PKCE(Proof Key for Code Exchange,代碼交換校驗密鑰)。聽起來很複雜對吧?但概念其實很簡單。 想像一下,如果代客收據是撕成兩半的,你保留一半,代客人員拿另一半。取車的時候兩個半片要能拼在一起才有效。這樣即使有人偷到其中一半,也沒辦法取到車。 PKCE 就是這個概念。應用程式會產生一個隨機的「code_verifier」(就像收據的一半),然後計算它的雜湊值作為「code_challenge」(另一半)。攔截者即使拿到 code_challenge 也沒用,因為他們不知道原始的 code_verifier。 ## 不同場景的應用差異 我發現 OAuth 在不同的應用場景下,安全考量還真的不一樣。 網頁應用相對簡單,因為它們有後端伺服器可以安全地儲存一些秘密資訊。就像飯店的代客服務有固定的櫃台和保全系統。 但手機應用或單頁應用(SPA)就麻煩了,它們就像街邊的代客服務,沒有安全的地方存放秘密資訊。所以它們必須使用 PKCE,而且令牌的有效期限通常要設得很短。 我還了解到,企業內部的系統又是另一回事。它們通常使用「客戶端憑證流程」,這是機器對機器的授權,就像公司內部各部門之間的自動化流程,不需要人工干預。 ## OAuth 的局限性 說實話,OAuth 也不是萬能的。我在研究過程中發現,很多人會誤以為 OAuth 就等於安全登入,但其實 OAuth 主要是做授權的,不是做身份驗證的。 這就像代客鑰匙只能證明你有權限使用這台車,但不能證明你就是車主。如果你需要真正的身份驗證,還是需要搭配 OpenID Connect 或其他機制。 另外,OAuth 的實作細節很容易出錯。我看過太多開發者因為沒有正確驗證 redirect_uri(重定向網址)或沒有使用 state 參數防範 CSRF 攻擊,結果被駭客利用。就像代客服務如果沒有確認取車人的身份,車子就可能被冒領一樣。 ## 從使用者的角度思考 現在每當我點下「用 Google 登入」按鈕時,我會注意看 Google 的授權頁面上寫了什麼。你知道嗎,不同的應用程式要求的權限差很多。有些只要求看你的基本資料,有些卻要求存取你的 Gmail 或 Google Drive。 我建議你也養成這個習慣。就像使用代客服務時會確認對方只是要停車而不是要開走你的車一樣,確認應用程式要求的權限是否合理很重要。 而且,你隨時可以到 Google 的帳戶設定裡面撤回這些授權。這就像代客鑰匙的時效性,你可以控制誰在什麼時候能存取你的什麼資料。 ## 未來的發展趨勢 根據 Gartner 2024 年的報告,OAuth 2.0 在存取管理市場得到廣泛採用,而且持續有新的安全增強功能在開發。即將到來的 OAuth 2.1 標準會讓現在的一些最佳實踐變成強制性的,包括必須使用 PKCE。 我也注意到,隨著行動應用和單頁應用的普及,OAuth 的安全機制還在持續演進。新的威脅不斷出現,安全專家們也在不斷想出新的對策。這就像汽車安全技術的發展一樣,永遠都有改進的空間。 ## 我的體悟 學會了 OAuth 的原理之後,我對網路安全有了更深的理解。原來看似簡單的「用 Google 登入」背後,竟然有這麼精巧的設計。 這讓我想到,我們每天使用的技術,其實都有很多故事。下次當你點下那個按鈕時,或許你也會想到代客泊車的比喻,想到那把特殊的虛擬鑰匙,想到背後那些為了保護我們資料安全而努力的工程師們。 說到底,OAuth 教會我的不只是技術知識,更是一種思維方式:如何在便利性和安全性之間找到平衡,如何用巧妙的設計解決複雜的信任問題。 這或許也是技術最迷人的地方吧 —— 它不只是冷冰冰的程式碼,而是人類智慧和創意的結晶。每一個優雅的解決方案背後,都有著設計者對使用者需求的深刻理解。 我覺得多了解一些我們每天在用的技術,真的很值得。不是要你變成專家,而是讓你在這個數位世界裡活得更明白、更安心。 --- **參考資料**: - RFC 6749 (OAuth 2.0 Authorization Framework) - Gartner 2024年零信任網路技術成熟度曲線 - 各大科技公司OAuth實作文件 - 2024年網路安全事件報告
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up