一厌衔、Cookie原理
// cookie.js
const http = require("http")
http.createServer((req, res) => {
if(req.url === '/favicon.ico'){
res.end('')
return
}
// 觀察cookie存在
console.log('cookie:', req.headers.cookie)
// 設(shè)置cookie
res.setHeader('Set-Cookie', 'cookie1=abc;')
res.end('hello cookie!!')
}).listen(3000)
首次請(qǐng)求服務(wù)端會(huì)在響應(yīng)的headers
里邊種下Cookie
璧帝,再次請(qǐng)求服務(wù),瀏覽器就會(huì)帶上Cookie
,
然后這樣會(huì)存在一些問題富寿,首先Cookie
不能存太大睬隶,設(shè)置在瀏覽器端可以看到可以被修改,不是那么的安全作喘。
二理疙、Session-cookie原理
正因?yàn)?code>Cookie的弊端,所以我們能不能把重要信息保存在服務(wù)器泞坦,Cookie
中值保留簡(jiǎn)單的一個(gè)ID將來用于去服務(wù)器獲取對(duì)應(yīng)信息
const http = require('http')
const session = {}
http.createServer((req, res) => {
const sessionKey = 'sid'
if (req.url === '/favicon.ico') {
return
} else {
const cookie = req.headers.cookie
if (cookie && cookie.indexOf(sessionKey) > -1) {
res.end('Come Back')
console.log('cookie:', req.headers.cookie)
// 簡(jiǎn)略寫法未必具有通用性
const pattern = new RegExp(`${sessionKey}=([^;]+);?\s*`)
const sid = pattern.exec(cookie)[1]
console.log('session:', sid, session, session[sid])
} else {
const sid = (Math.random() * 9999999).toFixed()
res.setHeader('Set-Cookie', `${sessionKey}=${sid}`)
session[sid] = { name: 'laowang' }
res.end('hello cookie')
}
}
}).listen(3000)
那么接下來看下Koa
中如何使用Session-cookie
模式
三、Koa中如何使用Session-cookie
// index.js
const koa = require('koa')
const app = new koa()
const session = require('koa-session')
// 簽名key keys作用 用來對(duì)cookie進(jìn)行簽名
app.keys = ['some secret'];
// 配置項(xiàng)
const SESS_CONFIG = {
key: 'ygc:sess', // cookie鍵名
maxAge: 86400000, // 有效期砖顷,默認(rèn)一天
httpOnly: true, // 僅服務(wù)器修改
signed: true, // 簽名cookie
};
// 注冊(cè)
app.use(session(SESS_CONFIG, app));
// 測(cè)試
app.use(ctx => {
if (ctx.path === '/favicon.ico') return;
// 獲取
let n = ctx.session.count || 0;
// 設(shè)置
ctx.session.count = ++n;
ctx.body = '第' + n + '次訪問';
});
app.listen(3000)
當(dāng)httpOnly
設(shè)置為true
的時(shí)候cookieygc:sess
在瀏覽器中是無法讀取的贰锁;
當(dāng)signed
設(shè)置為true
的時(shí)候,會(huì)成對(duì)的出現(xiàn)ygc:sess.sig
滤蝠,它是app.keys
和ygc:sess
哈希的結(jié)果豌熄;防止被篡改;
哈希會(huì)滿足幾個(gè)條件 把不定長(zhǎng)轉(zhuǎn)換成定長(zhǎng)物咳,摘要锣险,雪崩效應(yīng);
以上session放在本地览闰,多個(gè)實(shí)例不能共享