NodeJs中的cookie、Session-cookie

一、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.keysygc:sess哈希的结果;防止被篡改;
哈希会满足几个条件 把不定长转换成定长,摘要,雪崩效应;

以上session放在本地,多个实例不能共享

你可能感兴趣的:(NodeJs中的cookie、Session-cookie)