node學習之cookie和session

c什麼是cookiephp

Cookie設計的初衷是 維持瀏覽器和服務端的狀態。http是無狀態的,服務端不能跟蹤客戶端的狀態。 瀏覽器第一次向服務器發送請求,服務器會返回一個cookie給客戶端瀏覽器,瀏覽器下一次發送請求時,會攜帶cookie。
node

而node.js 的框架express 由於保持高性能, 沒有封裝太多的功能,而是按需加載的形式, 引入本身須要的中間件。而cookie 經常使用的插件是cookie-parserexpress

 

讀取cookie: 須要藉助cookie-parser。npm

//引入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放比較好。服務器

 

sessioncookie

session和基於cookie的。 存在於服務器,相對cookie安全,但session也存在session劫持的風險, 因此須要一串很長不少的祕鑰數組來增長破解的難度。同時設置manAge過時時間, 減小留給壞人破解時間。session

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是否被修改過

相關文章
相關標籤/搜索