Session存储在服务器,但它并不独立使用,而是与Cookie或配合使用。mysql
也就是说,在Cookie中存储了一个ID,服务端在接收到Cookie时对ID进行校验,只有经过校验才能够进行下一步处理,不然将让用户从新登陆。git
Session相对单纯的Cookie校验而言比较安全,但也有可能发生Session劫持。github
cookie-session是经常使用来处理Session的中间件。为了保证安全性,它是强制加密的。sql
npm install cookie-session
数据库
示例代码:/lesson06/server.jsexpress
同其余中间件相似,cookie-session也只须要server.use方法调用,并传入配置便可:npm
server.use(cookieSession({
// 循环密钥,其中有若干个密钥。若是只有一个密钥,容易被客户端破解,多个密钥相对安全
keys: [
'tVnVq4zDhDtQPGPrx2qSOSdmuYI24C',
'IUTEaA1wKoWnVDf4DspSBAjKvLWcyn',
'yC7cWHZDYoRMYawxSVDdzKQdXkZ9sE',
'Ikjk6OibzaBYiEM13Mrj8ITdb3DonG',
'uyajLZWgim4BS4SuQtH4kbTi640mWo',
],
// 设置20分钟有效期,若Session丢失,过时后将没法再被使用
maxAge: 20 * 60 * 1000
}))
复制代码
使用中间件后,在接口中对Session进行操做:浏览器
// 在接口中操做Session
server.get('/session', (req, res, next) => {
console.log(`Session: ${JSON.stringify(req.session)}`)
// 每次访问/session接口,就将Session中的number值加1
if (req.session.number) {
req.session.number++
} else {
req.session.number = 1
}
// 存储用户ID
req.session.id = 'lee'
res.send(`Session: ${JSON.stringify(req.session)}`)
})
复制代码
在浏览器中访问http://localhost:8080/session,就能够看到在页面上打印出的Session值,如Session: {"number":1,"id":"lee"}
。安全
在浏览器的控制台中能够看到保存在Cookie中的Session值:bash
express:sess: eyJudW1iZXIiOjEsImlkIjoibGVlIn0= // Session的值
express:sess.sig: 2wiwgJGBFBrNF4HuNSECtE39i8w // 对Session值的签名,用来保护Session不被篡改
复制代码
咱们能够尝试在控制台中直接修改express:sess
或express:sess.sig
的值,刷新后Session会由于校验不经过而被重置。
一般在项目开发中,也须要将Session保存在服务端,便于进行校验。
此时可使用JavaScript库如express-mysql-session,将Session保存在MySQL数据库中。