Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2019-11-17] Session 和 Cookie #22

Open
gracekrcx opened this issue Nov 17, 2019 · 2 comments
Open

[2019-11-17] Session 和 Cookie #22

gracekrcx opened this issue Nov 17, 2019 · 2 comments

Comments

@gracekrcx
Copy link
Owner

gracekrcx commented Nov 17, 2019

看了大大文章,紀錄以下筆記
白話 Session 與 Cookie:從經營雜貨店開始
淺談 Session 與 Cookie:一起來讀 RFC
深入 Session 與 Cookie:Express、PHP 與 Rails 的實作

session:是一種機制
cookie:是 browser 中可存放東西的地方

第一篇

  1. Session 是什麼?
    是一種讓 Request 變成 stateful 的機制。以小明的例子來說,Session 就是一種讓客人之間能互相關聯起來的機制。
  2. 如何實現 session ?
    在故事裡面:紙條跟手機裡的資訊來比喻,有多種方式可以達成 Session。
    在網路世界:也有很多種方式可以來實作 Session,第一種是網址列,第二種就是靠 Cookie。
    常見的錯誤認知是一定要有 Cookie 才能實作 Session,這是錯誤的。
  3. session 安全嗎?
    底下這 2 種方式都可以增加 session 的安全性
    1. Cookie-based session,意思就是把所有的 Session 狀態都存在 Cookie 裡面,但是加密以後再存。
    2. 另一個方法是把狀態存在 Server 端,靠一個 SessionID 來辨識,這個狀態你可以存成檔案,可以存在記憶體裡,也可以存在資料庫,只是實作方式的不同而已,但原理都是一樣的。

第二篇

  1. 更進一步說明 session 配 cookie 的歷史由來
  2. session 的 2 種解釋
    1. Session 是一種讓 Request 變成 stateful 的「機制」
    2. Session 的第二種解釋,就是「具有狀態的一段期間」,或者是「上下文」。
  3. GA 裡面有個名詞叫做「工作階段」,英文原名就叫做 Session,而 Google 對 Session 的解釋是這樣的:「指定期間內在網站上發生的多項使用者互動」,並且說可以把 Session 當作一個容器(Container)
  4. 伺服器把狀態放在 Set-Cookie 這個 Header 裡面送去瀏覽器,而瀏覽器在之後的 Request 把 Cookie 帶上,這樣子就成立一個 Session 了,後續的 Request 就有了狀態。
  5. Cookie-based session: 缺點就是存太多東西會變得笨重。
    SessionID:需要把狀態放在 Server。session information to be a key to a server-side resource
  6. Cookie 就是為了要建立 Session 而生的,因為在這之前要建立 Session 只能透過上一篇提到的那些方式,例如說用網址列帶資訊,或者是在 form 裡面放一個 hidden 的欄位。為了簡化這些行為才有了 Cookie。
  7. Cookie 裡放什麼狀態都行,但如果放的東西太多可以考慮把這些狀態移到 Server 去,只在 Cookie 裡放一個對應的 ID。這就是之前所說的 Session ID 與 Session Data。
  8. (RFC 6265)規格只說了「什麼是安全由 user agent 自己定義」,而沒有強制規範說「一定要在 HTTPS 的時候才能傳輸」。所以一般我們所認知的「Secure 就是代表一定要 HTTPS 才會被傳送」其實指的是主流瀏覽器的實作,而不是 RFC 的規範。
  9. Cookies 對 subdomain 並不具有完整性。舉例來說,foo.example.com 可以對 example.com 設置 cookie,而這個有可能把 bar.example.com 對 example.com 設置的 cookie 給蓋掉。最糟的情況下,當 bar.example.com 收到這個 cookie 時,區分不出是自己設置的還是別人設置的。foo.example.com 就可以利用這個特性來攻擊 bar.example.com。
  10. 大意就是說 Secure 屬性沒辦法保障 cookie 的完整性。攻擊者可以從 HTTP 覆蓋掉 HTTPS 的 cookie。
  11. 建立 Session 之後,所儲存的狀態就叫做 Session information。若是選擇把這些資訊存在 Cookie 裡面,就叫做 Cookie-based session;還有另一種方法則是在 Cookie 裡面只存一個 SessionID,其他的 Session 資訊都存在 Server 端,靠著這個 ID 把兩者關聯起來。

第三篇

Express
  1. 在 Express 裡面,管理 Session 的 middleware 是 express-session。
  2. 存在 cookie 裡面的 sessionID 的 key 一樣可以自己指定,但預設會是 connect.sid,所以以後看到這個 key 就知道這是 express-session 預設的 sessionID 名稱。
  3. 在這篇裡面我們看了三個不同的 Session 儲存方式。第一種是 express-session,把 session information 存在記憶體裡面;第二種是 PHP,存在檔案裡面;最後一種則是 Rails,採用了之前提過的 cookie-based session,將資訊直接加密並且存在 cookie 裡。
    比較

參考文章:
HTTP Session 攻擊與防護
我遇過的最難的 Cookie 問題
HTTP Cookies: Standards, Privacy, and Politics
Cookie Security

@gracekrcx
Copy link
Owner Author

Top issues on OWASP
session 如果放在 URL,任何人只要拿到這個 session id,不用知道你的帳密,就可以直接假裝是你,把你戶頭的錢轉走之類的。

@gracekrcx
Copy link
Owner Author

中間人攻擊(Man-in-the-middle attack)

APP有用HTTPS傳輸,但資料還是被偷了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant