全端勇士之路 Node.js 基礎學習-關於 Cookie & Session

前言

接下來將會講講 Cookie 與 Session 這兩個東西,身為一名網頁開發者,這兩個東西是一定要知道的

Cookie 通常會儲存我們造訪過的網站記錄,舉凡登入、偏好等等,那它的特性有以下

  • 記憶體僅可儲存 4KB
  • 能夠在 Client (瀏覽器)、Server (伺服器) 進行讀取與寫入
  • 是由 key/value 組合而成
  • 另外最大的特點就是可以設置失效日期

但是 Cookie 其實還可以分為兩種

  • 記憶體 Cookie
  • 硬體 Cookie

通常記憶體 Cookie 都是由 Client (瀏覽器)所維護,並且儲存於記憶體中,只要關閉瀏覽器就會消失,所以存在的時間極短。

硬體 Cookie 就有點特別了,它是儲存在硬體中,所以除非使用者手動清除 or 設置的時間到期,否則是不會刪除的,那時間通常是很久

所以若用時間來劃分就又可以稱之為兩種 Cookie,非長期 Cookie長期 Cookie

另外他也是有缺點的,因為 Cookie 本身只有 4 KB,所以較複雜的儲存方式是不可行的,另外 Cookie 也會導致流量的增加,最後如果使用 HTTP 的方式傳遞是會有安全性的問題,除非採用 HTTPS

Session

上面看完 Cookie 後,就是來講 Session,那麼 Session 又有什麼特別的呢?

  • 儲存在 Server 的暫存資料,可以放在記憶體或是資料庫上
  • Session 也可以在 Cookie 上儲存 UUID 確保知道你是誰

通常 Session 都會放在記憶體上,比較少會放在資料庫上

實務上呢?實務上通常都會結合這兩者一起搭配著使用進而驗證使用者的登入,這是最常見的實務做法,所以下面就來繼續講該如何用 JS 來寫吧

JavaScript 也可以做到替瀏覽器寫入 Cookie,甚至時間、過期時間等等,讓我們來看看語法吧

寫入 Cookie

1
document.cookie = 'name=Ray';

這樣就可以在 Cookie 上看到剛剛輸入的資料

Image

設置失效時間
(失效時間是使用 expirespath=/ 代表路徑的意思,通常時間會使用 GMT 時間)

1
document.cookie = 'name=Ray;expires=Thu, 04 Jul 2019 05:08:19 GMT;path=/';

GMT 時間產生方式

1
new Date().toGMTString();

設定時效

(max-age=5 意旨五秒後失效)

1
document.cookie = 'name=Ray;max-age=5;path=/';

在 Express 中可以使用 req.cookie 來取得使用者的 cookie,那如果回傳資料進去 cookie 呢?也是可以,例如名子是 Ray 失效時間是 5 秒,那麼就這樣寫 res.cookie('name','Ray', { maxAge: 5000 })

另外如果不想要讓人家使用 JS 取的 cookie 的話,就可以這樣改寫

1
2
3
4
res.cookie('name','Ray', {
maxAge: 5000,
httpOnly: true
})

這樣就無法透過 JS 來拉取 cookie 哩

Node.js Session

在 Express 環境下比較特別的是 Session,透過產生器是可以看到有 Cookie,但是並沒有 Session,所以在使用之前務必要記得先安裝 express-session

1
npm install --save express-session

引入的方式也非常簡單,官方文件 都有寫

1
var session = require('express-session')

那麼要使用這個套件一定是使用 app.use,所以這樣寫

1
2
3
4
5
6
app.use(session({
secret: 'keyboard cat', // 安全方式,會依照裡面的字串去做加密邏輯
resave: true, // 是否要每次進入網頁時重新設置 seesion cookie,如果有設置失效,例如 5 分鐘,重新整理後又有 5 分鐘,但是必須要改成 ture 才有效,但是建議改成 true
saveUninitialized: true,
cookie: { maxAge: 5000 } // 另外也可以設置 cookie 過期時間,例如 5 秒後過期
}))

那當然 Express 也可以查看使用者的 Session,只需要這樣寫就可以 req.session,反之也可以寫入如下

1
2
res.session.name = 'Ray';
res.session.account = 'QQ123';
0%