--- title: 12th 鐵人賽 Day_08 cookie? tags: 12th 鐵人賽 --- # 12th 鐵人賽 Day_08 cookie? 嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,有請今天的one piece! ![](https://i.imgur.com/URxA3AU.jpg) (不覺得騙人布其實也超強嗎?) ## cookie? 昨天我們說到實作 session 機制的方式有兩種,一種是利用網址,而另一種是 cookie 。今天要來講 cookie 的部分: 首先要先知道 cookie 跟 session 是不一樣的東西,`session 是一種讓 request 變成 stateful 的一種機制,而 cookie 是一種實作這個機制的一種方式` 那 cookie 到底是如何作用的呢?其實昨天有簡單提到, cookie 很像我們去餐廳點菜時,廚房給我們的那張明細單,上面記錄了所有我們點的菜,而廚房根據你的那張明細單給你菜。 回到網路世界的話是這樣: 瀏覽器發送一個 request 給 server ,而 server 傳回 response 的時候,叫瀏覽器把狀態設置成 cookie 存起來,下一次, server 會根據這張 cookie 內容來決定狀態。 休但幾咧!這樣的狀況好像有些問題?! ![](https://i.imgur.com/l4GENxz.jpg) ## 面臨的問題 1. 如果我的明細單掉了...,是不是代表任何人都可以領走我的菜?因為廚房只認明細單。 2. 如果廚房是根據我的明細單來出菜給我,那我只要偷偷的在明細單上自己多加幾道菜,不就...誒嘿嘿~反正他們只認明細單呀~ ![](https://i.imgur.com/3wBb5Mi.gif) 咳!是的,回到網路世界的話,當 cookie 設置好後,任何人擁有你的cookie 都可以存取你在 server 上的資料;或是,你在 cookie 加點東西, server 也都是會承認的,因為server是根據那張cookie來決定狀態。 ## 解套方式 ### **Cookie-based session** 你說把 cookie 上的東西加密起來?是的,這也是一個好方法,這就是所謂的 `Cookie-based session`,把東西都存在 cookie 裡並加密,這樣降低了被竄改的機率。 不過當要儲存的狀態越來越多,你的 cookie 也就越來越肥大了...,別忘了,cookie 是存在瀏覽器裡的,超過瀏覽器的限制,瀏覽器就不理你了。 因此,當要儲存的狀態很多的時候,用`Session-based session`會是比較好的選擇。 ### **Session-based session** 一樣用點菜去比喻的話...,有去麥當勞點過餐吧?點餐之後,會給你一張明細表(讓你看的),也會給你一張號碼牌,而你要拿你的號碼牌去領餐,廚房那邊會根據這個號碼牌來出餐。號碼牌就是 cookie,號碼就是所謂的 `session ID`。 讓我們回到網路世界來:server 會要求瀏覽器將一組不易重複的 ID,也就是上面提到的`session Id`,設置成cookie,而 server 那邊利用這組 ID 去比對寫在 server 端的狀態(Data)。 這樣的話就比較不會有被竄改的問題(機率不能說沒有,但超級低),不過特別要注意的是,server 一樣只會認那張 session ID ,若是有別人拿到這個一樣是有權存取你的資料的,所以當有駭客拿到一批 session ID 或是server 那邊有被攻擊或是什麼的,通常都會把所有的 session ID 清掉,下次再重新發送。 --- 以上就是cookie的內容了,幫各位統整一下: 1. cookie 是一種實作 session 這個機制的一種方式 2. cookie 出現後會有資料被竄改的問題,避免方式有: 1. **Cookie-based session** 將狀態通通寫在 cookie 裡,並加密。缺點是狀態多的時候, cookie 會很肥,而瀏覽器存 cookie 是有限制的,超過就不給存了。 2. **Session-based session** 發session ID給瀏覽器並存成cookie,其他的狀態放在server裡,利用cookie裡的sessionID,來決定狀態。 感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見! ![](https://i.imgur.com/PPbpd2b.gif) --- #### 參考文章 [白話 Session 與 Cookie:從經營雜貨店開始](https://bre.is/E3onkFYt)