Cookie 和 Session 究竟是什麼?以及如何在Express中實作

Yi
Feb 18, 2021

--

Cookie 和 Session 是什麼

Cookie

是伺服器在本地端上存儲的小段文本並隨每一個請求發送至同一個伺服器

cookie主要是用來解決HTTP協議無狀態的問題,伺服器會利用Header的set-cookie屬性夾帶資料(通常為sessionId等可以辨別使用者的簡單訊息),而瀏覽器在每次發送請求時都會夾帶cookie

cookie有一些限制:

  • 大小約 4kb
  • 每次發送請求都會帶上

Session

任何伺服器能認出使用者狀態的時間區間,就叫做 Session

網路上看到的定義有許多種,上面是我覺得比較可以理解的定義

若要給個簡單的定義,那我會說session是伺服器用來儲存使用者資料或其他資料,透過cookie中的sessionID來比對session中是否有該筆資料,來判斷該請求來自哪位使用者

實作session-cookie機制

本次實作會用到express-session套件

$ npm install express-session  //安裝套件
  1. 引入套件
  2. app.use(session):所有請求都會使用session
  3. secret屬性: 用來簽發session ID cookie
  4. resave屬性: 儲存session即使沒變修改過
  5. saveUninitialized屬性: 儲存未初始化的session,未初始化表示session是新的且未被修改過
  6. cookie屬性: 可以客製化設定要傳送過去的cookie屬性,預設值為{ path: '/', httpOnly: true, secure: false, maxAge: null }
  • domain:Cookie 的有效 domain,如果未設定,就會自動綁在執行 Set-Cookie 的 domain 下;雖然可以自行設置,但其實也只能在一級/次級網域之間調整,寫到其他人的 domain 是寫不進去的。
  • maxAge:有效期限,單位是毫秒
  • Expires:同上,只是指定的是時間點 (Note: 若maxAge與Expires同時被設置,那麼較後面的屬性會被採用)
  • secure:安全,當這個屬性被設為 true 時,此 Cookie 就只會在「安全的協議」下傳輸,通常為 HTTPS (Note: 若客戶端沒有使用HTTPS連線,將不會回傳cookie給伺服器)
  • httpOnly:只能在網路傳輸中使用,當設為 true 時,此 Cookie 就無法在任何 JavaScript 程式碼(document.cookie)中取得

參考資料

  1. [JavaScript] Cookie、LocalStorage、SessionStorage 差異
  2. 前端三十|27. [WEB] Cookie & Session 是什麼?
  3. http://expressjs.com/en/resources/middleware/session.html

--

--