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