iT邦幫忙

2024 iThome 鐵人賽

DAY 24
1
Software Development

從零開始的後端學習之旅系列 第 24

DAY24 探索身份驗證的世界:三種方法的解析

  • 分享至 

  • xImage
  •  

前言

昨天的文章中,簡單介紹了驗證(Authentication)和授權(Authorization)這兩個重要概念,以及它們之間的區別。今天的文章將會更深入地探討三種驗證的方法,包括 Session-based Authentication、Token-based Authentication 和 HTTP Basic Authentication,那就開始吧~
/images/emoticon/emoticon30.gif

HTTP Basic Authentication

小明在進入演唱會現場時,出示了紙本門票以及身分證,經過保全的檢查後順利入場。不過,在演唱會的中場休息時,小明想出去上廁所,或買杯飲料。當他再次回到入口準備進入會場時,保全依然要求他重新出示門票來確認身份。這是因為演唱會有成千上萬的觀眾,保全無法記住每一個人,也無法憑記憶辨認出小明是否已經驗票進場過,因此必須再次驗票,才能確保他有資格進入會場。

RFC 7617中定義的 HTTP Basic Authentication 是一種基本且簡單的驗證方式。然而,由於這種方式本身不具備加密機制,帳號與密碼僅透過Base64進行編碼放進 header 中傳輸,因此安全性較低,因此強烈建議與 TLS(即 HTTPS)一起使用,來保障數據傳輸的安全。這種驗證方式通常只會應用於公司內部系統,或是對安全要求不高的情況。

如同上面的演唱會比喻,這種驗證方式不會記住你的身份。每次當你離開並重新進入頁面時,系統都會再次要求你輸入帳號和密碼來確認身份。這就像你每次進入場館時,都必須重新出示門票,而不是憑藉過往的驗票記錄進場。

驗證畫面及流程如下:
https://ithelp.ithome.com.tw/upload/images/20241008/20167721BG9BYkcNY3.png
使用者輸入以下帳號密碼:

帳號:user
密碼:password

瀏覽器將帳號與密碼使用冒號串起來,並使用Base64進行編碼:

user:password
dXNlcjpwYXNzd29yZA==

送出請求,並且包含Authorization這個 http header

Authorization:Basic dXNlcjpwYXNzd29yZA==

最後伺服器收到請求再透過 Base64 進行解碼,進行身份驗證。

Session-based Authentication

小明在進入演唱會現場時,出示了紙本門票以及身分證,保全檢查通過後,就發給了小明一個由場館核發的手環,代表小明是通過驗證的人,之後進出場館只要出示手環就好,不需要再拿出紙本門票。

Session-based Authentication 是一種 有狀態(stateful) 的驗證方式。當使用者通過身份驗證後,伺服器會在資料庫中儲存一個與使用者相關的 session,其中包含使用者的身份資訊(如帳號、驗證狀態)。然後伺服器會將這個 session 的 ID 傳回給使用者,通常會以 cookie 的形式保存於瀏覽器中。在後續的請求中,使用者只需要發送包含這個 session ID 的請求,伺服器就可以根據 session ID 來確認使用者的身份,並允許進行相應的操作。

這就像是上述場景中的小明通過驗票後,場館會在內部系統中儲存他已驗票的資料,並發給他一個手環(session ID)。接下來,小明只要憑著這個手環就可以自由進出場館,而不需要每次重新驗票。場館(伺服器)會根據這個手環辨識出小明的驗票狀態,這樣就可以方便地進行驗證。

驗證過程如下:

  1. 使用者輸入帳號、密碼向伺服器發送登入請求
  2. 伺服器驗證登入請求後,將 session 傳送至資料庫儲存,並回傳包含會話 ID 的 cookie 給使用者
  3. 使用者發送帶有 cookie 的新請求
  4. 伺服器在資料庫中檢查 cookie 中的 session ID,如果找到,則將資料傳送給使用者

Token-based Authentication

小明在進入演唱會現場時,出示了電子票證,裡面記錄了全部的信息,包括小明的身分證明、購票資訊,於是保全只要掃瞄過後就可以進行驗證,不管小明進出場館幾次,都只要掃描電子票證就可以通行無阻。

Token-based Authentication 是一種無狀態(stateless)的驗證方式。與 session-based 的差別在於,Token-based Authentication 並不會在伺服器中記住你的驗證狀態,在最一開始登入時,伺服器會給你一個 token,在後續的每次登入都要附上這個 token 以進行驗證。

這就像是上述場景中的小明,在一開始購票時,場館(伺服器)就發送給了小明一個 電子票證(token),小明只要透過掃描電子票證就可以自由進出場館,場館並不需要記住任何資料,因為全部的資訊都包括電子票證內了。

驗證過程如下:

  1. 使用者輸入帳號、密碼,向伺服器發送登入請求
  2. 伺服器進行驗證,通過後生成 token 給使用者
  3. 使用者在後續請求中附帶 token
  4. 伺服器直接驗證 token 的有效性,如果有效就將資料傳送給使用者

小結

今天的文章中,介紹了三種驗證方法:HTTP Basic Authentication、Session-based Authentication 和 Token-based Authentication。每種方法都有其特點與適用場景。HTTP Basic Authentication 適合安全要求不高的情況,但需要配合 HTTPS 以保障資料安全;Session-based Authentication 方便並具有狀態管理,但伺服器需要記住每個用戶的會話,且可擴展性較低;Token-based Authentication 則無狀態,適合與第三方應用整合,如串接 API 等情境,不過伺服器無法進行 session 的管理。
/images/emoticon/emoticon29.gif

參考資料

HTTP基本認證
基本驗證雖小,至少能確認你是誰
RFC 7617
Session-Based vs. Token-Based Authentication: Which is better?


上一篇
DAY23 驗證(Authentication)跟授權(Authorization)是什麼?
下一篇
DAY25 Session vs. Cookie:如何讓你的網站記住使用者?
系列文
從零開始的後端學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言