---
# System prepended metadata

title: 12th 鐵人賽 Day_09 sessions in Rails？
tags: [12th 鐵人賽]

---

---
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)