在上一篇的文章裡非常簡略的介紹Cookie是什麼,那麼這次就了解一下提到Cookie一定會提到的 Session 吧! 開始GoGo~
Session 是什麼?
Session 的中文有「會話」、「對話」的意思,可以讓請求與回應在一段期間內具有狀態,如果沒有狀態在這期間功能會失效,因此讓請求與回應的時間裡是有狀態是重點。
Session 也是會負責記錄在Server端使用者的資訊,並且在使用者進行完成驗證後記錄用戶所需的用戶資料之後,接著產生出一組對應的ID存入Cookie中傳回Client端。
為什麼需要 Session ?
這邊需要來簡單的補充說明一下HTTP的特性,HTTP是無狀態( Stateless)的協議設計有關,此特性會讓網站之間的請求是獨立且不相關的性質,因此是沒有辦法紀錄在網站上所做的行為當然也包括每次請求的內容,但根據上一篇文章內有提到Cookie有一些儲存資訊的功能,但Cookie其實在傳輸的過程中是沒有加密而且容易被篡改,所以相較於Cookie比較重要的資訊就會選擇使用Session。
如何實現 Session 機制
為了容易套用方法先來設定一下情境,今天有一個購物網站的網址是store.tw,當你看到一款的後背包很喜歡想將它加入購物車,在按下加入購物車的瞬間以及結帳的時候在不同的實現機制中會是什麼樣子。
- 方式1_網址(URL)
在按下加入購物車的瞬間其實是發出了一個請求給server,然後server會將你的網址導向store.tw?item=backpack,最後按下結帳的時候server是依照你的網址列上的queryString(查詢字串)來判斷,這也是存取狀態的地方。
只不過網址列儲存資訊的安全性不高之外有些瀏覽器對於queryString有長度的限制。
- 方式2_Cookie
Session和Cookie是可以搭配使用的,在按下加入購物車的瞬間瀏覽器發出一個請求給Server,Server叫瀏覽器設置 Cookie,瀏覽器便把item1=backpack存在 Cookie 裡面,最後按下結帳的時候瀏覽器帶著剛剛存入新資料的Cookie一起發請求給Server,最後根據 Cookie 的內容判斷狀態。
但前段文字中才提到Cookie在傳輸的過程中是沒有加密而且容易被竄改的,所以必須解決這個問題。
如何避免儲存在Cookie的Session資料被竄改
- 解決方法1
將儲存在Cookie的所有 Session 狀態進行加密,而這種將所有 Session 狀態都存在Cookie裡面的做法叫做Cookie-based session,但缺點是Cookie是有限制存放的大小的,若加密後的內容大於限制存放的大小瀏覽器是沒有辦法儲存的。
- 解決方法2
透過Session ID來判斷身分,當Server在設置Cookie的時候就只將Session ID儲存在Cookie內而其他的狀態都儲存在Server裡面,在這之後的請求等等的動作就只需要判斷有無 Session ID找出該 Session 來取得更多的資料或是建立一組新的 Session 和 Session ID。
小整理
- 可以實現 Session 機制的方法並不是只有常見的Cookie而已,也是可以使用內文提到的網址,只不過相較於Cookie的作法比較不方便與安全。
- Session 是屬於存放資料於Server端,而Cookie是屬於存放資料於使用者端,因此重要的資料選擇在儲存在Session裡面再透過儲存在Cookie中的Session ID 來判斷身分資料會更加安全。
參考: