iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

Ruby on Rails 新手的30個問題!系列 第 8

Day_08 cookie?

嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,一樣開始之前,有請今天的one piece!

(不覺得騙人布其實也超強嗎?)

cookie?

昨天我們說到實作 session 機制的方式有兩種,一種是利用網址,而另一種是 cookie 。今天要來講 cookie 的部分:

首先要先知道 cookie 跟 session 是不一樣的東西,session 是一種讓 request 變成 stateful 的一種機制,而 cookie 是一種實作這個機制的一種方式

那 cookie 到底是如何作用的呢?其實昨天有簡單提到, cookie 很像我們去餐廳點菜時,廚房給我們的那張明細單,上面記錄了所有我們點的菜,而廚房根據你的那張明細單給你菜。

回到網路世界的話是這樣:

瀏覽器發送一個 request 給 server ,而 server 傳回 response 的時候,叫瀏覽器把狀態設置成 cookie 存起來,下一次, server 會根據這張 cookie 內容來決定狀態。

休但幾咧!這樣的狀況好像有些問題?!

面臨的問題

  1. 如果我的明細單掉了...,是不是代表任何人都可以領走我的菜?因為廚房只認明細單。
  2. 如果廚房是根據我的明細單來出菜給我,那我只要偷偷的在明細單上自己多加幾道菜,不就...誒嘿嘿~反正他們只認明細單呀~

咳!是的,回到網路世界的話,當 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,來決定狀態。

感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見!


參考文章

白話 Session 與 Cookie:從經營雜貨店開始


上一篇
Day_07 session ?
下一篇
Day_09 sessions in Rails?
系列文
Ruby on Rails 新手的30個問題!30

尚未有邦友留言

立即登入留言