Leon's Blogging

Coding blogging for hackers.

Cookie & Session

| Comments

用於讓 server 記住 client 的行為與資料。

Cookie

由於 HTTP 協定是無狀態((Stateless)的,server 端無法得知使用者在前端的操作內容,阻礙了前端與後端對話,因此 cookie 就是被設計來解決這個問題的機制。

  • 當 server 想要儲存使用者的某些狀態時,就可以發送 cookie 給 client
  • http header 裡面其中一個欄位
  • key / value 的形式儲
  • 檔案大小最多 4Kb
  • 以明文的方式在網際網路上傳輸及在 Client 端電腦儲存,所以不建議儲存敏感資料
  • 儲存在 client 的瀏覽器
  • 儲存位置
    • 記憶體 cookie:由瀏覽器維護,當瀏覽器關閉,cookie也隨之消失,為非持久性的
    • 硬碟 cookie:存在用戶端硬碟中,有一個過期時間,除非使用者手動清理cookie或是超過過期時間,否則cookie不會消失,為持久性的

Session

  • 儲存在 server 端
  • session 需要 cookie 的輔助才能產生運作
  • server 會傳送帶有 session id 的 cookie 給 client,當下一個 request 及cookie 再被送至 server 端時,會用 cookie 中的 session id 來辨認每個使用者所儲存的狀態與 data。
  • 相對於 cookies,session 多用來儲存敏感的資料,也常常成為攻擊的目標 Session Hijacking

rails 裡的 Session & Cookie

session

1
2
3
4
5
6
7
#設定
session[:current_user_id] = user.id
#移除
session[:current_user_id] = nil
session.delete(: current_user_id)
#整個 session 清掉
reset_session

session store

config/initializers/session_store.rb 裡面可以設定

  • :cookie_store(預設)
  • :active_record_store 使用資料庫來儲存(安全性較高)
    • 需搭配 activerecord-session_store gem,產生sessions資料表
  • :mem_cache_store 使用Memcached快取系統來儲存,適合逾須兼顧效能的高流量網站

Rails預設採用 Cookies session storage 來儲存 Session 資料,它是將 Session 資料透過 config/secrets.yml 的 secret_key_base 編碼後放到瀏覽器的 Cookie 之中

cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#設定
cookies[:commenter_name] = @comment.author
#移除
cookies.delete(:commenter_name)
#保護不能讓使用者亂改 signed
cookies.signed[:user_preference] = @current_user.preferences
#盡可能永遠留在使用者瀏覽器的資料 permanent
cookies[:remember_token] = { value:   remember_token,
                             expires: 20.years.from_now.utc }
#上下相等
cookies.permanent[:remember_me] = [current_user.id, current_user.salt]
#permanent 預設為 20 年後過期 = 20.years.from_now

#可一起用
cookies.permanent.signed[:remember_me] = [current_user.id, current_user.salt]
1
2
3
4
5
#Rails 3 是 digitally signed cookie 可以用這方法 decode
#Rails 4 則改為 Encrypted cookies 就無法
require 'rack'
cookie = "BAh7CUkiD3Nlc3Npb25faWQGOgZFRkkiJ(...)"
Rack::Session::Cookie::Base64::Marshal.new.decode(cookie)

官方文件:

參考文件:

Comments