--- title: 12th 鐵人賽 Day_09 sessions in Rails? tags: 12th 鐵人賽 --- # 12th 鐵人賽 Day_09 sessions in Rails? 嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,開始之前一樣有請今天one piece! ![](https://i.imgur.com/M1q3Prg.jpg) (喜歡布魯克跟拉布!) ### 前情提要 昨天我們把 cookie 實作 session 的兩種方式簡單的介紹了一下,幫大家回顧一下: 1. **Cookie-based session** 將狀態通通寫在 cookie 裡,並加密。缺點是狀態多的時候, cookie 會很肥,而瀏覽器存 cookie 是有限制的,超過就不給存了。 2. **Session-based session** 發session ID給瀏覽器並存成cookie,其他的狀態放在server裡,利用cookie裡的sessionID,來決定狀態。 ### 正文開始 那 Rails 實作 session 的方式是什麼呢???我寫到這邊,早就覺得 Session-based session 的實作方式比較好,畢竟cookie 只存sessionID ,被取得資料的風險又更小了,而且又沒有大小限制的問題。 但是!But!しかし! Rails是用 Cookie-based session 的方式來實作的,因為這種方式比其他的方案都還要快,[官方文件](https://guides.rubyonrails.org/security.html#session-storage)也有貼心提醒各位是這樣運作,有幾個安全性的問體要考慮,以下是官方文件的文字: >Rails CookieStore saves the session hash in a cookie on the client-side. The server retrieves the session hash from the cookie and eliminates the need for a session ID. That will greatly increase the speed of the application, but it is a controversial storage option and you have to think about the security implications and storage limitations of it: 不外乎是記得要考慮以下幾點: 1. cookie 的檔案最大只能到4kB,請只存 session 相關的資訊 2. cookie 是存在在 client 端的,有可能洩漏,請不要存敏感資訊 3. cookie 是暫時存在的(可能隨時被清除),請將永久的資訊放在 server 端 4. cookie 無法讓自身失效,但可以被惡意的重用,建議最好設置段時間讓 sessionID 失效 5. Rails 預設會加密你的 cookie,只要你好好保管加密方式,基本上,cookie是安全的 --- 以上大約是 Rails 實作 session 的方式,所以大家在寫專案的時候要注意,session 跟 cookie 存了什麼喔! By th way,其實官方文件寫得很棒,還介紹了一些hacker攻擊的手法,有時間大家可以看一下。 感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見! ![](https://i.imgur.com/PPbpd2b.gif) --- #### 參考文章 [官方文件](https://guides.rubyonrails.org/security.html#session-storage) [深入 Session 與 Cookie:Express、PHP 與 Rails 的實作](https://github.com/aszx87410/blog/issues/46)