【Web】各種網頁記錄使用者資訊的方法:Seesion、Cache、Cookie、ViewData & ViewBag

  • 70
  • 0
  • Web
  • 2022-03-31

原本這一篇只是要記錄Cache 的使用,後來一並研究其他不同的資料儲存方式:Seesion、Cache、Cookie、ViewData & ViewBag。
簡單來說,他們有各自適合的使用場景跟生命週期,在不同情況所使用不同的方案,以下一一進行介紹。
 

Session

存放地點:Server 記憶體中
生命週期:一個瀏覽器一個Session,開啟該網站 ~ 關閉瀏覽器或是超過閒置時限。簡單來說就是Active 的概念,離開後就可以丟掉的資訊。
說明:例如用Edge 打開購物網站就會產生一個Session。如果開了很多不同商品的分頁,Session 還是保持唯一。
直到把瀏覽器關閉,或是太久沒操作被Timeout ,Session 就會被清除。
如果這個時候再用Chrome 打開一樣的網站,就會新建立一個Session。
使用場景:一個使用者進入購物網站但是沒有登入,Server 可以利用Session 記錄他觀看過甚麼商品,如此不論使用者跑去哪一個畫面,都可以顯示出"您最近看過的商品"。由於"您最近看過的商品" 以後沒有要利用,離開之後就可以丟了,就用Session 存起來。

Cookie

存放地點:使用者端的瀏覽器
生命週期:一個使用者一個,基本上永久,除非使用者清除,也可以設定時效性
說明:會透過Request Header 傳送,所以適合存放簡短的字串資料。
使用場景:知名(?猜單字遊戲 Wordle,雖然沒有登入,但他把過關資訊記錄在cookie 裡。
所以可以知道你今天有沒有通關,歷史的通關紀錄等等資訊。一旦透過瀏覽器設定把cookie 清掉,記錄也就全部不見。通常網站保持登入資訊也會寫在cookies 中,所以清除cookie 時可能會登出網站。
 

備註:也因為Cookie 常常存放敏感資訊,內容最好簡短且加密。在資安考量下也會注重以下幾個項目

  1. 時效性:max-age
  2. 安全性:Secure = HttpOnly,如此cookie 就不能從document.cookie 抓出來,以免被javascript 攻擊拿走個資
  3. 區域性:SameSite,限定cookie 只能在同一個網域使用,以免cookie 被跨網站拿走

Cache

存放地點:Server 記憶體中
生命週期:所有使用者共用,基本上永久,可設定時效性或服務重啟後就會釋放掉。
說明:全域變數的概念
使用場景:靜態固定的網站內容或是變數,在服務首次啟動的時候可以存在快取裡,就不需要每個Request 都重新撈資料產生。

ViewData & ViewBag

存放地點:Server 端
生命週期:一個使用者一個畫面一個,從後端傳到前端渲染內容,傳給Client 之前就結束生命週期
說明:攜帶簡單的資料到前端進行利用。ViewData 採Dictionary,ViewBag 採dynamic,存取時要小心以免造成Exception
使用場景:MVC _Layout.cshtml,將網站的title tag 內容指定為ViewBag.Title,如此除了可以在View 用Razor 語法去改變之外,也可以在Controller(後端) 運算之後產生不同的Title 內容。

參考資料:
https://jeffprogrammer.wordpress.com/2015/12/05/caching-in-asp-net-mvc-5/
https://ithelp.ithome.com.tw/articles/10222885
https://dotblogs.com.tw/hatelove/2009/06/28/viewstate-session-cache-cookies-application-of-user-state
https://juejin.cn/post/6884786030189215752