c什么是cookie
Cookie設計的初衷是 維持瀏覽器和服務端的狀態。http是無狀態的,服務端不能跟蹤客戶端的狀態。 瀏覽器第一次向服務器發送請求,服務器會返回一個cookie給客戶端瀏覽器,瀏覽器下一次發送請求時,會攜帶cookie。
而node.js 的框架express 因為保持高性能, 沒有封裝太多的功能,而是按需加載的形式, 引入自己需要的中間件。而cookie 常用的插件是cookie-parser
讀取cookie: 需要借助cookie-parser。
//引入cookieparser 框架,讀取客戶端發送的cookie
const express = require('express'); const cookieParase = require('cookie-parser'); var app = express();
//這點很重要,如果沒有,下面的req.cookies 會返回undefined app.use(cookieParase()); app.use('/', function (req,res) { res.cookie('user', 'lililiwen'); console.log(req.cookies); res.send('objkle') }) app.listen(8080)
發送cookie, 不需要借助中間件, 可以直接用 res.cookie();
刪除cookie: res.clearCookie(名字);
cookie 簽名
1 const express = require('express'); 2 const cookieParser = require('cookie-parser'); 3
4 //隨機生成的字符串
5 var signStr = 'xadsafeowirw'
6
7 var app = express(); 8
9 //需要將密匙傳給cookieParser, 在接收數據的時候,進行解析。
10 app.use(cookieParser(signStr)); 11
12 app.use('/', function (req, res) { 13 //將密匙字符串賦值給req.secret,可以省略,在上面cookieparser()時會自動對secret賦值
14 req.secret=signStr; 15
16 //返回給瀏覽器的cookie, 這就是傳說中的種cookie了
17 //如果需要開啟簽名,第三個參數對象signed 設置為true.
18 //由於cookie的大小限制4k,而簽名后的cookie體積會增加,所以重要的cookie才簽名
19 res.cookie('cookiename', 'liwen', {signed: true, maxAge: 3600}) 20
21 //有沒有簽名的cookie,獲取方式不一樣。
22 console.log('無簽名', req.cookies); 23 console.log('帶簽名',req.signedCookies); 24 res.send('ok') 25 }) 26 app.listen(8080);
打開瀏覽器的Application 可以看到簽名后的cookie,簽名后的cookie, 我們可以直接在字符串上看到原文(liwen)。可用encodeComponent() 解碼。 簽名的作用是讓服務端知道cookie有沒有被修改。並不能做到加密。 而有中間件可以做到加密: cookie-encrypter 不過加密cookie,沒有意義,破解只是時間問題,重要的東西還是往session放比較好。
session
session和基於cookie的。 存在於服務器,相對cookie安全,但session也存在session劫持的風險, 所以需要一串很長很多的秘鑰數組來增加破解的難度。同時設置manAge過期時間, 減少留給壞人破解時間。
node中有的中間件 是cookie-session
1 const express = require('express'); 2 const cookieParser = require('cookie-parser'); 3 const cookieSession = require('cookie-session'); 4
5 var app = express(); 6
7
8 app.use(cookieParser()); 9
10 //cookieSession 必須放在cookieParser后面
11 app.use(cookieSession({ 12 //session的秘鑰,防止session劫持。 這個秘鑰會被循環使用,秘鑰越長,數量越多,破解難度越高。
13 keys: ['aaa', 'bbb', 'ccc'], 14 //session過期時間,不易太長。php默認20分鍾
15 maxAge: 60*60, 16 //可以改變瀏覽器cookie的名字
17 name: 'session'
18 })); 19
20 app.use('/', function (req, res) { 21
22 //假設使用count記錄用戶訪問的次數
23 if(req.session['count'] == null) { 24 req.session['count'] = 1; 25 }else{ 26 req.session['count']++; 27 } 28 console.log(req.session['count']) 29 res.send('ok') 30 }) 31 app.listen(8080) 32
33 //刪除 delete req.session
瀏覽器中可以看到,服務器通過respond的set-cookie返回cookie
session是返回的cookie ID, session.sig 是session簽名,作用是知道session是否被修改過