1. 程式人生 > >node學習之cookie和session

node學習之cookie和session

沒有 需要 target ssi exp encode 刪除cookie defined 分享

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

技術分享圖片

node學習之cookie和session