全端勇士之路 Node.js 基礎學習-關於 Cookie & Session
前言
接下來將會講講 Cookie 與 Session 這兩個東西,身為一名網頁開發者,這兩個東西是一定要知道的
Cookie
Cookie 通常會儲存我們造訪過的網站記錄,舉凡登入、偏好等等,那它的特性有以下
- 記憶體僅可儲存 4KB
- 能夠在 Client (瀏覽器)、Server (伺服器) 進行讀取與寫入
- 是由 key/value 組合而成
- 另外最大的特點就是可以設置失效日期
但是 Cookie 其實還可以分為兩種
- 記憶體 Cookie
- 硬體 Cookie
記憶體 Cookie
通常記憶體 Cookie 都是由 Client (瀏覽器)所維護,並且儲存於記憶體中,只要關閉瀏覽器就會消失,所以存在的時間極短。
硬體 Cookie
硬體 Cookie 就有點特別了,它是儲存在硬體中,所以除非使用者手動清除 or 設置的時間到期,否則是不會刪除的,那時間通常是很久
所以若用時間來劃分就又可以稱之為兩種 Cookie,非長期 Cookie 與長期 Cookie
Cookie 的缺點
另外他也是有缺點的,因為 Cookie 本身只有 4 KB,所以較複雜的儲存方式是不可行的,另外 Cookie 也會導致流量的增加,最後如果使用 HTTP 的方式傳遞是會有安全性的問題,除非採用 HTTPS
Session
上面看完 Cookie 後,就是來講 Session,那麼 Session 又有什麼特別的呢?
- 儲存在 Server 的暫存資料,可以放在記憶體或是資料庫上
- Session 也可以在 Cookie 上儲存 UUID 確保知道你是誰
通常 Session 都會放在記憶體上,比較少會放在資料庫上
實務上呢?實務上通常都會結合這兩者一起搭配著使用進而驗證使用者的登入,這是最常見的實務做法,所以下面就來繼續講該如何用 JS 來寫吧
JavaScript Cookie
JavaScript 也可以做到替瀏覽器寫入 Cookie,甚至時間、過期時間等等,讓我們來看看語法吧
寫入 Cookie
1 | document.cookie = 'name=Ray'; |
這樣就可以在 Cookie 上看到剛剛輸入的資料
設置失效時間
(失效時間是使用 expires
,path=/
代表路徑的意思,通常時間會使用 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=/'; |
Node.js Cookie
在 Express 中可以使用 req.cookie
來取得使用者的 cookie,那如果回傳資料進去 cookie 呢?也是可以,例如名子是 Ray 失效時間是 5 秒,那麼就這樣寫 res.cookie('name','Ray', { maxAge: 5000 })
另外如果不想要讓人家使用 JS 取的 cookie 的話,就可以這樣改寫
1 | res.cookie('name','Ray', { |
這樣就無法透過 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 | app.use(session({ |
那當然 Express 也可以查看使用者的 Session,只需要這樣寫就可以 req.session
,反之也可以寫入如下
1 | res.session.name = 'Ray'; |