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服务器(10):处理POST请求
Dec 18 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 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开发中的安全防范知识详解
2013/06/06 PHP
php实现插入排序
2015/03/29 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
js中的string.format函数代码
2020/08/11 Javascript
js 函数的副作用分析
2011/08/23 Javascript
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
javascript中的隐式调用
2018/02/10 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
Python算法之图的遍历
2017/11/16 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
中海讯通笔试题
2015/09/15 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript