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 npm包管理的配置方法及常用命令介绍
Jun 05 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
nodejs基础应用
Feb 03 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 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中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
sina的lightbox效果。
2007/01/09 Javascript
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
详解vue+css3做交互特效的方法
2017/11/20 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
python基于socket实现网络广播的方法
2015/04/29 Python
用Python编写web API的教程
2015/04/30 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
python3.5仿微软计算器程序
2020/03/30 Python
使用python实现生成用户信息
2017/03/20 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
Python双链表原理与实现方法详解
2020/02/22 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
董事长职责范文
2013/11/08 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
环保建议书400字
2014/05/14 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS