一、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)
// 设置cookie
res.setHeader('Set-Cookie', 'cookie1=abc;')
res.end('hello cookie!!')
}).listen(3000)
首次请求服务端会在响应的headers
里边种下Cookie
,再次请求服务,浏览器就会带上Cookie
,
然后这样会存在一些问题,首先Cookie
不能存太大,设置在浏览器端可以看到可以被修改,不是那么的安全。
二、Session-cookie原理
正因为Cookie
的弊端,所以我们能不能把重要信息保存在服务器,Cookie
中值保留简单的一个ID将来用于去服务器获取对应信息
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)
// 简略写法未必具有通用性
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作用 用来对cookie进行签名
app.keys = ['some secret'];
// 配置项
const SESS_CONFIG = {
key: 'ygc:sess', // cookie键名
maxAge: 86400000, // 有效期,默认一天
httpOnly: true, // 仅服务器修改
signed: true, // 签名cookie
};
// 注册
app.use(session(SESS_CONFIG, app));
// 测试
app.use(ctx => {
if (ctx.path === '/favicon.ico') return;
// 获取
let n = ctx.session.count || 0;
// 设置
ctx.session.count = ++n;
ctx.body = '第' + n + '次访问';
});
app.listen(3000)
当httpOnly
设置为true
的时候cookieygc:sess
在浏览器中是无法读取的;
当signed
设置为true
的时候,会成对的出现ygc:sess.sig
,它是app.keys
和ygc:sess
哈希的结果;防止被篡改;
哈希会满足几个条件 把不定长转换成定长,摘要,雪崩效应;
以上session放在本地,多个实例不能共享