Cookie & Session 的差異
Cookie
Cookie 是伺服器(Server)傳送給瀏覽器(Client)的一小片段資料,並請瀏覽器保存起來,以便往後向相同的伺服器發送請求時,附上這 Cookie 的資料。
Cookie 常見用途 :
- 儲存和追蹤使用者行為
- 儲存用戶登入、購物車等伺服器所需的資訊
- 儲存使用者設定和偏好等
基本用戶登入流程範例 :
- 使用者透過瀏覽器登入畫面登入
- 伺服器端通過驗證後,可以將使用者「已經登入」的資訊附在 Cookie 中回傳,並請瀏覽器保存起來
- 往後,每當瀏覽器對伺服器發出請求時,會一併附上存有使用者「已經登入」狀態資訊的 Cookie 給伺服器
- 伺服器透過 Cookie 就能辨識這位使用者已經通過驗證了
使用 Cookie 傳送重要資訊的安全性隱憂 :
透過 Cookie,我們的確達成目標,讓伺服器可以在往後透過客戶端發出的請求,辨識使用者及其登入狀態,非常方便。然而,有趣的是,這些資訊其實用戶是有機會可以在瀏覽器中修改的,因此使用者能透過串改 Cookie 上的=內容,讓伺服器收到不正確的訊息,因此儘量避免將敏感資訊透過 Cookie 存在客戶端。
Session
瞭解到存放較敏感的資訊在客戶端是有安全上的疑慮,也因此我們改使用 Session 將使用者相關的敏感資訊存放在伺服器端 — 可能在記憶體或資料庫中 — 並創建一個相對應且獨特的 ID(Session ID),在回傳給客戶端的 Cookie 中一併附上,未來客戶端只要附上含有這個 Session ID 的 Cookie 給伺服器,伺服器就能匹配相對應的 Session,也能找到需要的敏感資料了!
瞭解 Cookie 和 Session 間的關係
想像你入住飯店,飯店告知有關你的入房、預約餐廳和遊樂設施的資訊都已經存在飯店的系統當中了,並附上一支專屬的感應錶,手錶晶片中有系統給你的專屬 ID 號碼,因此這幾天在飯店直接感應房門、在餐廳或遊樂設施前感應機器就能透過系統辨識完成開門和報到。
你的個人資訊很重要,因此飯店將入房、預約資訊以 Session 存放在系統中,這筆資料對應了一個獨特的 Session ID。而感應錶就像是 Cookie,當中帶有這個 Session ID,當你透過感應錶在感應機器時,系統就能快速辨識你的身份,並找到存放你入房和預約資料的 Session 了!
如同前面所說的,重要的資訊不建議放在客戶端 — 像是寫在你的感應錶上,你就有機會串改遊樂設施的預約時間、其他人也有機會看到你的隱私等,若放在飯店的系統中(像是伺服器的概念),就顯得安全許多,你唯一需要的是那支含有獨特 ID 的感應錶讓系統辨識罷了!
總結重點 :
- 使用者敏感的資訊(例如「已登入狀態」的資訊)將被存放在伺服器端,而不是客戶端,因此客戶無法任意在瀏覽器中修改,資料保存也較安全
- 伺服器會將一個獨特的 Session ID 附在回傳的 Cookie 給瀏覽器,未來伺服器只要透過這個 Session ID,就能找到相對應的 Session data(例如使用者提供了這個 Session ID,伺服器就能知道該名使用者已經登入過)
- 有了 Session ID 同個用戶透過客戶端發出的「不同請求」給相同的伺服器時,伺服器都能辨識對方為相同的瀏覽器
結語 :
在沒有使用 Cookie 和 Session 之前,照理來說,不同的請求都是獨立的,這一次發出的請求是拿不到上一次的資訊。然而透過 Session,我們得以將用戶敏感資訊儲存在伺服器端,搭配 Cookie,伺服器得已透過客戶端每次發出的不同請求,獲取所需要的 Session ID ,找到需要使用的用戶資訊。