在昨天的文章中,簡單介紹了驗證(Authentication)和授權(Authorization)這兩個重要概念,以及它們之間的區別。今天的文章將會更深入地探討三種驗證的方法,包括 Session-based Authentication、Token-based Authentication 和 HTTP Basic Authentication,那就開始吧~
小明在進入演唱會現場時,出示了紙本門票以及身分證,經過保全的檢查後順利入場。不過,在演唱會的中場休息時,小明想出去上廁所,或買杯飲料。當他再次回到入口準備進入會場時,保全依然要求他重新出示門票來確認身份。這是因為演唱會有成千上萬的觀眾,保全無法記住每一個人,也無法憑記憶辨認出小明是否已經驗票進場過,因此必須再次驗票,才能確保他有資格進入會場。
在RFC 7617中定義的 HTTP Basic Authentication 是一種基本且簡單的驗證方式。然而,由於這種方式本身不具備加密機制,帳號與密碼僅透過Base64
進行編碼放進 header 中傳輸,因此安全性較低,因此強烈建議與 TLS(即 HTTPS)一起使用,來保障數據傳輸的安全。這種驗證方式通常只會應用於公司內部系統,或是對安全要求不高的情況。
如同上面的演唱會比喻,這種驗證方式不會記住你的身份。每次當你離開並重新進入頁面時,系統都會再次要求你輸入帳號和密碼來確認身份。這就像你每次進入場館時,都必須重新出示門票,而不是憑藉過往的驗票記錄進場。
驗證畫面及流程如下:
使用者輸入以下帳號密碼:
帳號:user
密碼:password
瀏覽器將帳號與密碼使用冒號串起來,並使用Base64進行編碼:
user:password
dXNlcjpwYXNzd29yZA==
送出請求,並且包含Authorization這個 http header
Authorization:Basic dXNlcjpwYXNzd29yZA==
最後伺服器收到請求再透過 Base64 進行解碼,進行身份驗證。
小明在進入演唱會現場時,出示了紙本門票以及身分證,保全檢查通過後,就發給了小明一個由場館核發的手環,代表小明是通過驗證的人,之後進出場館只要出示手環就好,不需要再拿出紙本門票。
Session-based Authentication 是一種 有狀態(stateful) 的驗證方式。當使用者通過身份驗證後,伺服器會在資料庫中儲存一個與使用者相關的 session,其中包含使用者的身份資訊(如帳號、驗證狀態)。然後伺服器會將這個 session 的 ID 傳回給使用者,通常會以 cookie 的形式保存於瀏覽器中。在後續的請求中,使用者只需要發送包含這個 session ID 的請求,伺服器就可以根據 session ID 來確認使用者的身份,並允許進行相應的操作。
這就像是上述場景中的小明通過驗票後,場館會在內部系統中儲存他已驗票的資料,並發給他一個手環(session ID)。接下來,小明只要憑著這個手環就可以自由進出場館,而不需要每次重新驗票。場館(伺服器)會根據這個手環辨識出小明的驗票狀態,這樣就可以方便地進行驗證。
驗證過程如下:
小明在進入演唱會現場時,出示了電子票證,裡面記錄了全部的信息,包括小明的身分證明、購票資訊,於是保全只要掃瞄過後就可以進行驗證,不管小明進出場館幾次,都只要掃描電子票證就可以通行無阻。
Token-based Authentication 是一種無狀態(stateless)的驗證方式。與 session-based 的差別在於,Token-based Authentication 並不會在伺服器中記住你的驗證狀態,在最一開始登入時,伺服器會給你一個 token,在後續的每次登入都要附上這個 token 以進行驗證。
這就像是上述場景中的小明,在一開始購票時,場館(伺服器)就發送給了小明一個 電子票證(token),小明只要透過掃描電子票證就可以自由進出場館,場館並不需要記住任何資料,因為全部的資訊都包括電子票證內了。
驗證過程如下:
今天的文章中,介紹了三種驗證方法:HTTP Basic Authentication、Session-based Authentication 和 Token-based Authentication。每種方法都有其特點與適用場景。HTTP Basic Authentication 適合安全要求不高的情況,但需要配合 HTTPS 以保障資料安全;Session-based Authentication 方便並具有狀態管理,但伺服器需要記住每個用戶的會話,且可擴展性較低;Token-based Authentication 則無狀態,適合與第三方應用整合,如串接 API 等情境,不過伺服器無法進行 session 的管理。
HTTP基本認證
基本驗證雖小,至少能確認你是誰
RFC 7617
Session-Based vs. Token-Based Authentication: Which is better?