Web 基本功 - Cookie 與 Session
Cookie
1.1 什麼是 Cookie ?
Cookie 在使用者第一次進入網站的時候產生。Browser 記錄一些隱私性較低的資料。
例如: 使用者第一次進入網站的時候會跳出教學視窗。當使用者點擊[關閉]後,Cookie
內記錄使用者已經看過教學了。使用者在下次登入的時候因為 Cookie 內記錄著使用者
已經看過教學,所以就不會跳出教學視窗。
1.2 Cookie 的特性
- 每個網站的 Cookie 是分開的, 例如: www.google.com 無法取得 www.yahoo.com 的 cookie。
- 能夠設定失效的時間。比如說過一段時間你就需要重新登入,就是由設定 Cookie Expired Time 來完成。有時候為了方便,也可能將 Cookie 設定為永久不失效。
1.3 Server 端如何讓 Browser 儲存 Cookie
- Client 請求 Server 給予頁面
- Server 回 Response 給 Browser 的時候,HTTP Header 帶上
Set-Cookie
。Browser 接收到 Set-Cookie 指令時,會將 Cookie 的名稱和值儲存在 Browser 的 Cookie。
1.4 Browser 在每次 Request 的時候會帶上 Cookie
Browser 在每次對 Server 發出 Request 的時候會帶上 Cookie
的 Header,讓 Server 能夠正確的存取當前 Cookie。
Session
2.1 什麼是 Session
Session 就像你進入一個遊樂園,手上先蓋個章,下次進入的時候就知道你是誰。
遊樂園就好比是 Server,你就好比是 Client (Browser)。
Client 要怎麼儲存這個章呢? 有兩種方法:
- 使用 Cookie (set cookie)
- 使用 html 儲存,例如: hidden input。
拿章去 Server 換資料也有兩種方法:
- 使用 Cookie
- Query string/POST
因為實作上的方便程度與效能考量,大部分的網站採用 Cookie 來完成 Session 的實作。
2.2 Cookie-based Session 與 Session Storage
Cookie-based Session 指的 Session 儲存的方式不同,而不是拿章去 Server 換資料的時候有沒有使用 Cookie。
常見的 Session Storage 有這幾種:
- Database
- Memcached
- Cookie
2.3 比較 Cookie-based Session 與 Memcached Store Session
來比較一下這兩者的優缺點。 Cookie-based Session 的優點:
- 對伺服器的效能負擔很低
- 方便使用
缺點:
- 大小最多存4Kb。
- 資料存放在瀏覽器上如果
config/secrets.yml
外流可能存在被破解的風險 (詳見 Rails CookieStore 的安全議題)。
Memcached Store Session 的優點:
- memcached 使用記憶體來儲存,讀取速度快。
- 可以實現集中式管理。
- 不會受到 cookie 4kb 大小的限制。
缺點:
- 儲存方式用記憶體,持久化有疑慮。
- 在追求高效能高併發的情景下,cookies 的表現更好,因此很多大網站採用 cookies 作為 session store.
2.4 Session 傳值
Session 傳值指的是利用 Session 儲存資料的機制,讓不同頁面間可以互相傳遞資料。
- 使用 Query String 或是 POST 把資料往 Server 傳
- Server 將收到的資料存到 Session 中。
- 在不同頁面的時候因為你的章是同一個,可以讀取 Session 中儲存的資料也是同一份,達到傳值的目的。
Rails 中的 Cookie-based Session 安全性問題
Rails 3 以前 cookie-based session 如果不特別設定,可以輕易的被解開:
1 |
|
解開後會像這個樣子
1 |
|
Rails 4 以後的 Cookie-based Session 會經過 Secret 加密。好好保護你的 config/secret.yml
能夠讓 Session 中的隱密資料不會被解開,從下面 code 可以看出要解開的話需要不少的麻煩:
1 |
|
references
Rails CookieStore 的安全議題 - Shaolin.TW