document.cookie = 'name=alice;max-age=5' // max-age在浏览器端的单位为秒
const http = require('http') const server = http.createServer((req, res) => { res.setHeader('Set-Cookie', ['age=16;max-age=20000']) // max-age在nodejs的单位为毫秒 res.end('cookie') })
const Koa = require('koa') const app = new Koa() const Router = require('koa-router') const router = new Router() router.get('/login', (ctx, next) => { ctx.cookies.set('wheater', 'sunny', { maxAge: 60*1000 }) ctx.body = 'set cookie' }) router.get('/user', (ctx, next) => { const cookie = ctx.cookies.get('wheater') ctx.body = cookie }) app.use(router.routes()) app.use(router.allowedMethods()) app.listen(7000, ()=>{console.log('开启服务')})
使用nodejs中的http模块对请求进行响应需要自己处理复杂逻辑,通过 koa 可以简化很多操作,比如koa就自动加上了 HttpOnly的属性
const Koa = require('koa') const Router = require('koa-router') const Session = require('koa-session') const app = new Koa() const router = new Router() // signed: true 增加一个sessionid的签名文件 sessionid.sig const session = Session({ key: 'sessionId', maxAge: 60 * 1000, signed: true }, app) app.keys = ['alice'] app.use(session) router.get('/login', (ctx, next) => { const id = 1; const name = 'lucy' ctx.session.user = { id, name } ctx.body = 'set session' }) router.get('/user', (ctx, next) => { ctx.body = ctx.session.user // { id: 1, name: 'lucy'} }) app.use(router.routes()) app.use(router.allowedMethods()) app.listen(7000, () => { console.log('开启服务') })
session以base64编码的形式进行存储,可以被解码,也并不完全安全,所以通过 signed: true 设置密钥,使增加一个加密后的 sessionid.sig,这样服务器在获取cookie中设置的session数据就会对数据的真实性进行校验