node學習之cookie和session


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM