什麼是 cookie, session?

December 19, 2024

什麼是 cookie, session ?

在介紹什麼是 cookie, session 之前,要先知道一個很重要的概念,那就是

http 協定是一個無狀態的溝通方式,也就是說伺服器是不會保存兩次不同 request 的資料

但在現在高戶動的網站下,我們會需要記住使用者在網頁上所做過的事情,例如電商網站判斷使用者是否登入了,又或是購買了哪些商品?也因此有了 cookie 的功能,可以在瀏覽器紀錄使用者當前的狀態,並且在每一次跟後端伺服器溝通時把 cookie 帶上。

Cookie 由瀏覽器處理,具有幾個特性:

  • 特定網域:只針對原本的 網域(domain) 起作用。舉例: 在 *.myExample.com 存入的 cookie,不會出現在 *.not-myExample.com
  • 有生命期限: 到了所設定的生命期限之後會失效。
  • 在向該 domain 的 server 發送請求時,也會被一併帶進去該請求中__。

聽起來很方便,但他有幾個缺點

  • cookie 的容量限制是 4kb 左右,無法儲存太多東西
  • cookie 每次請求時都會帶上,因此還是會造成一些效能上的影響
  • cookie 是可以透過前端篡改的(架設電商商品價格存在 Cookie ,而後端又單純只透過前端資料把訂單寫入資料庫,那我就可以用 1 元買到最新的 iphone 16 XD )

第3點竄改的問題,有人想到那我把資料進行加密是不是就可以了,但這樣的問題就會是隨著資料越來越多,加密的檔案會超過容量限制

因為 cookie 的限制,我們不可能把使用者的所有狀態資料全部儲存進來,這時就有人想到,不如我們只要在使用者第一次訪問伺服器時給予他一個 id 並存到 cookie 裡面 (set-cookie),同時伺服器也儲存這個 id 以及他所有的狀態,這樣每次透過比對 id 找出資料即可,而這就是 Session

除了 cookie 之外,在 html5 出了 web storage 可以用來儲存更大的資料來解決 cookie 的儲存空間、安全性問題,下方是個簡單的比較表

| | 儲存時效 | 不同網頁、標籤是否可以共用 | 儲存大小 | 儲存位置 | 與Server溝通 | 應用場景 | | ------------------- | --------------- | ------------- | ---- | ------------ | ------------- | ----------------------------------- | | LocalStorage | 不會過期,除非手動清除 | 是 | 5mb | 客戶本地 | 不會 | 保存用戶的個人設置或首選項,例如語言偏好、主題選擇等

彈窗是否開啟過 | | Session Storage | 每次分頁或瀏覽器關掉後就會清除 | 否 | 5mb | 客戶本地 | 不會 | 表單數據 | | Cookie | 可設置時效,關閉清除 | 是 | 4kb | 客戶本地(跟著電腦設備) | 每次http請求時都會戴上 | 判斷用戶是否登錄 |

參考資料