# Session 與 Cookie ###### tags:`Frontend` 假設現在有一個購物網站,你把一系列商品加入購物車之後,想說等到周年慶再一次下單。那麼再次開啟這個購物平台時,瀏覽器是怎麼做到把你之前下訂的商品清單一字不落、完完整整的送出 response 的呢? 要知道, HTTP 這個協定本身是 stateless (無狀態的),也就是說:對它來說,每個 request 都是獨立不相關的個體(沒錯,就跟統計上的獨立是一樣的意思)。 ## session: 給予狀態 > session 這個詞是一個抽象DER概念,表示 有狀態的 (在前端比較接近這個意思) > 或者更精確的說是"具有狀態的一段期間"...ummm 比如說設定 cookie 然後到這個 cookie 過期之間的這一段期間嗎? 為了讓瀏覽器記得 request 之間的關係(從 stateless 變成 stateful),需要給予 session 的概念,實作的方法可以有很多種,這裡介紹兩種方法:網址列 或 cookie。 ### 網址列 使用 querystring 來把購物清單的內容記下來,SERVER 靠著它來辨認 response 需要傳哪些商品內容給使用者(買家)。例如這樣: `www.myshop.list?apple=1&banana=5` ### cookie SERVER 在接收到 request 之後,response 瀏覽器把購物清單的內容存放在 cookie,之後只要把這個 cookie 內容傳給 server,server 就可以知道之前的購物清單內容了,例如: `setcookie('list', 'apple=1&,anana=5', $expire)` ## 防止資料被竄改 網址列或 cookie 實作出的 session 都是明碼狀態,也就是說很容易被竄改,為了避免這類資安問題,這邊介紹兩種方法:Cookie-based session 或 Session Identifier ### Cookie-based session > 這個詞完整一起看比較好...,它不是 session,它是一種加密 顧名思義,把 Cookie 裡面的內容給加密 ### Session Identifier Server 在 Cookie 裡面存一個 Session ID,其餘的狀態都存在 Server 那邊,靠著這個Session ID 來辨認使用者。 ## express session session 的應用 ==Session 負責紀錄在 server端上的使用者訊息==,會在一個用戶完成身分認證後,存下所需的用戶資料,接著產生一組對應的 ID,存入 cookie 後傳回用戶端。 Session泛指有始有終的系列動作/消息,好比會話一般。 試想 Cookie是一張領餐的號碼牌,而Session是一張數位會員卡, 記錄你的點餐號碼,還可以紀錄你的餐點細節,消費記錄和點餐喜好。,解決Cookie遺失的問題。 若今天替某個Client端的Request建一個Session的時候,Server會先檢查這個Client端的Request裡是否有包含了Session標識(Session id),如果已包含一個Session id,表示這個發起Request的Client端是已經存放過的id,Server就按照Session id,把這個Session找出來使用。但如果Client端請求不包含Session id,,則表示他是新臉孔,那Server端就為此Client端創建一個Session,並生成一個Session id,並Response給Client端保存。 小結: session:帳號登錄驗證過後,Server端所發的識別證 cookie:是瀏覽器存放資料的地方,可以存放seesion之類的資料