iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Security

跨出第一步:D 從0到0.1的Web security 系列 第 5

Day 4: 網站如何記住我? Cookie 與 Session

  • 分享至 

  • xImage
  •  

為什麼需要cookie跟session這東西?

根本原因只有一個:HTTP 協定是 Stateless (無狀態) 的。

這代表每個 HTTP Request 對 Server 來說都是獨立事件,它不會記得你上個 Request 做了什麼。如果沒有額外機制,你每點一個連結或刷新頁面,Server 都會當你是第一次來,導致剛登入就馬上被登出。

為了解決這個問題,讓 Server 能在跨 Request 的場景下識別使用者狀態(如登入、購物車),就需要 Session 和 Cookie 協同工作。

簡單類比一下:
你 (Client):使用者瀏覽器
店家 (Server):網站後端
Cookie:你手上的會員卡 (上面只有一組編號)
Session:店家櫃檯裡,你的那份會員檔案 (存著你的詳細資料)

技術拆解

Cookie

本質:存放在 Client 端 (瀏覽器) 的一小段 Key-Value 文字檔。由 Server 透過 Set-Cookie Header 發給瀏覽器。

作用:當作識別證。瀏覽器在後續對同一個 Server 發送的所有 Request 中,都會自動在 Cookie Header 裡帶上它。

儲存點:Client 端的瀏覽器。

內容:通常只放不敏感的識別用資料,最核心的就是 Session ID。其他像是語系偏好、佈景主題也能放。

安全性:低。因為資料直接暴露在 Client 端,可以被使用者查看、修改,也可能被攔截。

生命週期:可由 Server 設定效期 (expires)。可以是瀏覽器關閉就失效 (Session Cookie),也可以是持續數天的永久 Cookie。

Session

本質:在 Server 端為特定 Client 建立的一個專屬資料儲存區,通常是存在記憶體、檔案或資料庫裡。

作用:記錄特定使用者的「狀態」,例如登入資訊、權限等級、購物車內容等。

儲存點:Server 端。

內容:可以存放任何類型、大量且敏感的資料。

安全性:高。因為所有資料都封裝在 Server 內部,Client 端無法直接存取,只能透過 Server 發的 Session ID 間接對應。

生命週期:Server 端管理。通常在使用者閒置超時 (Timeout) 或主動登出時銷毀。

完整工作流程 (Workflow)

整個流程的核心就是用 Cookie 來傳遞 Session ID。

Step 1:Server 建立 Session
使用者首次訪問或登入成功時,Server 會在後端為他建立一個 Session,並產生一個全域唯一的 Session ID 來當作這個 Session 的 Key,然後將使用者的狀態資料存進去。

Step 2:Server 回傳 Session ID (透過 Cookie)
Server 在 HTTP Response Header 中,透過 Set-Cookie 指令,將剛產生的 session_id 送回給瀏覽器。通常還會加上 HttpOnly 標記來防止前端腳本存取,增加安全性。

Step 3:瀏覽器後續 Request 自動帶上 Cookie
瀏覽器收到這個 Cookie 後會存起來。之後所有對同網域的 Request,都會自動在 Header 中夾帶這個 Cookie。

Step 4:Server 驗證 Session ID 並還原狀態
Server 收到 Request,從 Cookie Header 讀取到 session_id。接著拿這個 ID 去後端儲存區查找對應的 Session 資料。只要能找到,Server 就能還原使用者之前的狀態,並回傳對應的資料。

下一步

理論講完了,明天我們就來打開開發者工具,看看我們這幾天學到的內容。


上一篇
Day 3: 一封信的旅程:從請求到回應的 HTTP 傳輸流程
下一篇
Day 5: 【實作】打開開發者工具,解析 HTTP Request & Response
系列文
跨出第一步:D 從0到0.1的Web security 9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言