Nodejs 和Session 原理及实战技巧小结


Posted in NodeJs onAugust 25, 2017

Nodejs 和Session 原理及实战技巧小结

一 Cookie

因为HTTP协议是没有状态的,但很多情况下是需要一些信息的,比如在用户登陆后、再次访问网站时,没法判断用户是否登陆过。于是就有了cookies,用于在浏览器端保存用户数据,它有如下特点

1 是在客户端浏览器端才有的

2 用于记录信息,大小最大为4K字节

3 如果使用了cookies,那么任何对该域名的访问都会带上cookies

目前新型网站更多的采用浏览器缓存,cookie会存在一些问题,比如你每次往服务器提交请求时,都会带上cookie,无论是你访问的是不是静态图片。

cookie例子:

Nodejs 和Session 原理及实战技巧小结

二 Session

session类似服务器端的cookie,保存于服务器端,类似于服务器缓存。用户登陆了总需要验证吧,那么就在session中验证即可,session和cookie是一一对应关系。

session的创建顺序

生成全局唯一标识符(sessionid);

开辟数据存储空间。一般会在内存中创建相应的数据结构,但这种情况下,系统一旦掉电,所有的会话数据就会丢失,如果是电子商务网站,这种事故会造成严重的后果。不过也可以写到文件里甚至存储在数据库中,这样虽然会增加I/O开销,但session可以实现某种程度的持久化,而且更有利于session的共享;

将session的全局唯一标示符发送给客户端。

问题的关键就在服务端如何发送这个session的唯一标识上。联系到HTTP协议,数据无非可以放到请求行、头域或Body里,基于此,一般来说会有两种常用的方式:cookie和URL重写。

三 Set-Cookie

Cookie是如何被设置的呢?是被服务器返回的请求设置的。

Nodejs 和Session 原理及实战技巧小结

服务器会返回一个set-cookie的消息,通知浏览器要设置cookie了,于是浏览器会根据set-cookie里的字段来设置信息了,比如上图的信息就会设置session=r@rdegges.com

四 实战

我们以client-session(express-session基本完全一样)为例,为项目配置session

1 安装模块

var session = require('client-sessions');

2 配置session

app.use(session({
 cookieName: 'session',
 secret: 'random_string_goes_here',
 duration: 30 * 60 * 1000,
 activeDuration: 5 * 60 * 1000,
}));

1)secret:一个随机字符串,因为客户端的数据都是不安全的,所以需要进行加密

2) duration:session的过期时间,过期了就必须重新设置

3) activeDuration: 激活时间,比如设置为30分钟,那么只要30分钟内用户有服务器的交互,那么就会被重新激活。

五 在Session中保存用户信息

app.post('/login', function(req, res) {
 User.findOne({ email: req.body.email }, function(err, user) {
  if (!user) {
   res.render('login.jade', { error: 'Invalid email or password.' });
  } else {
   if (req.body.password === user.password) {
    
    // sets a cookie with the user's info
    req.session.user = user;
    // 这里貌似有误,只是set了session,返回这个sessionid,但但数据并不会set到这个cookie里头
    
    res.redirect('/dashboard');
   } else {
    res.render('login.jade', { error: 'Invalid email or password.' });
   }
  }
 });
});

六 Session层中间件

我们当然不希望每个请求都加上这一段,所以我们使用express来做全局配置

app.use(function(req, res, next) {
 if (req.session && req.session.user) {
  User.findOne({ email: req.session.user.email }, function(err, user) {
   if (user) {
    req.user = user;
    delete req.user.password; // delete the password from the session
    req.session.user = user; //refresh the session value
    res.locals.user = user;
   }
   // finishing processing the middleware and run the route
   next();
  });
 } else {
  next();
 }
});

如果用户逻辑在没有登陆时必须登陆,那我们可以继续加一个路由

function requireLogin (req, res, next) {
 if (!req.user) {
  res.redirect('/login');
 } else {
  next();
 }
};
app.get('/dashboard', requireLogin, function(req, res) {
 res.render('dashboard.jade');
});

七 安全性

1 我们可以在登出时重置session

app.get('/logout', function(req, res) {
 req.session.reset();
 res.redirect('/');
});

还可以加一些安全性

httpOnly:用来保证cookie只能通过http访问,而不能用js来读取

secure:强制使用https

ephemeral:关闭浏览器时同时关闭cookie

八 总结

Cookie和session由于实现手段不同,因此也各有优缺点和各自的应用场景:

  1. 应用场景

Cookie的典型应用场景是Remember Me服务,即用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,比如页面布局以及搜索历史等等。
Session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景;

  1. 安全性

cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。

Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于cookie;

  1. 性能

Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的;

  1. 时效性

Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时);

  1. 其他

Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了太多。

继续补充下,关于如何做一个完整的登陆

1 用户端

一般来说应该使用https,而且密码绝不能在网络中明文传输,因此在往服务器传输时就应该先加密,常见的md5,但md5被破解,因此可以用SHA512来加密 SHA256(password)

2 服务端

服务端需要对密码再进行加密,因为所有客户端的东西都是不安全的,万一你的网络被监听了呢,因此会进行 SHA512(username+SHA512(password)+sault)的加密,这里的sault为随机数,防止被脱库了后被猜出密码,所以需要附加一个随机数,这个sault最好是存放到另外的数据库中,防止因为存到一个库中被脱库中猜出

总结

以上所述是小编给大家介绍的Nodejs 和Session 原理及实战技巧小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

NodeJs 相关文章推荐
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
nodejs开发微博实例
Mar 25 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 #NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 #NodeJs
nodejs动态创建二维码的方法
Aug 12 #NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 #NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 #NodeJs
让nodeJS支持ES6的词法----babel的安装和使用方法
Jul 31 #NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 #NodeJs
You might like
php xml文件操作代码(一)
2009/03/20 PHP
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
python使用Tkinter显示网络图片的方法
2015/04/24 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
行政经理岗位职责
2013/11/09 职场文书
建筑个人求职信范文
2014/01/25 职场文书
中班中秋节活动反思
2014/02/18 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
会议室使用管理制度
2015/08/06 职场文书