对session和cookie的整理

cookie

1、什么是cookie

是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。

Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中。

2、为什么要使用cookie?

这是因为http是无状态的,两次请求间,服务器不知道用户上一次执行了什么操作,这严重的阻碍了交互式web应用程序的实现。服务器可以通过设置或者读取cookie中存储的信息,借此维护用户和服务器会话中的状态

3、cookie有哪些优点

cookie机制将信息存储于用户硬盘,因此可以作为跨页面全局变量

4、cookie有哪些缺陷

  • cookie的安全性不够高
    cookie的信息是存储在浏览器中的,所以容易被篡改,因此我们不会将很重要的信息存储在cookie中
  • cookie可能被禁用
  • cookie可能被用户删除
  • cookie的存储空间很小(只有4kb左右)
    cookie由于每次请求都要向后台发送数据,所以容量要有限制,否则会大大降低网络传输效率。
  • cookie会被附加在每个HTTP请求中,所以无形中增加了流量。

5、一般在什么场合使用cookie

  • 保持用户的登陆状态
  • 跟踪用户的行为,比如记录用户浏览数据,进行商品(广告)推荐
  • 创建购物车

6、如何使用cookie

  1. 服务器端给客户端发送cookie
const express = require('express');
var server = express();
server.use('/aaa/a.html',function(req,res){//只能对aaa目录下的a.html起作用
    res.cookie('user','blue',{
    path:'/aaa',//cookie存储的路径,匹配该路径才发送这个 cookie。
    maxAge:30*24*3600*1000//以毫秒为单位,表示过期时间
    });
    res.send('ok');
});
server.listen(8080);

对session和cookie的整理

  1. 使用cookie-parser中间件读取cookie
const express = require('express');
const cookieParser = require('cookie-parser');
var app = express();
app.listen(8080);
app.use(cookieParser('aass'));
//这里要注意的是,我们之前在/aaa中请求了cookie,而我们在/中能读取到,是因为cookie是向上级读取的
app.get('/',function (req,res) {   
	 res.secret='aass';    
	 res.cookie('name','GeZi',{        
	 	path:'/',//访问哪一个路径的时加上cookie        
	 	maxAge:20*60*1000,//cookie的存活时间,单位毫秒        
	 	signed:true//是否加签名
	 });  
	 console.log('没有签名的cookie:',req.cookies);    
	 console.log('签名后的cookie:',req.signedCookies);    
	 res.send(req.cookies);
});
  1. 清除cookie
res.clearCookie('name')

session

什么是session

Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。

Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。

为什么要使用session

  • cookie不够安全
    cookie是保存在客户端的数据,容易被篡改,session保存在服务器端,不会被篡改。
  • cookie可以存储的内容太少了
    session

那么问题来了,既然cookie相对于session有那么大的不足,为什么还需要cookie呢?

因为session是基于cookie实现的,当建立一个新session的时候,向客户端下发一个session-id,让客户端保存session-id在cookie中,下一次发起请求的时候,将session-id发回后台,后台通过session-id,在很多session中查找到相应session-id对应的session进行操作。

一般在什么场合使用session

  • 会话管理 登录,购物车,游戏分数或服务器应记住的任何其他内容
  • 个性化用户首选项,主题和其他设置
  • 跟踪记录和分析用户行为

如何使用session

这里用到cookie-session中间件

const express = require('express');
const cookieParser = require('cookie-parser');
const cookieSeesion = require('cookie-session');
var server = express();
server.listen(8080);

server.use(cookieParser('这段签名的字符串可以是随意的'));
(function () {    
	var arr = [];    
	for(var i = 0;i<10000;i++){    
	    arr.push('keys_'+Math.random());   
 	}
 	server.use(cookieSeesion({    
 	    keys:arr,        
 	    name:'session_id',//加密的cookie的名字,最后通过这个来从服务端查找到对应的人        				    maxAge:20*60*1000    
 	    }))
})();

server.get('/',function (req,res) {  
	  console.log(req.session['test']);    
	  if(typeof req.session['test'] == 'undefined'){    
	      req.session['test'] = 'xixi';        
	      res.send('这是第一次访问');   
	  }else{    
	      res.send('这不是第一次访问'); 
}});

cookie和session的区别

  1. 存放位置不同
    Cookie保存在客户端,Session保存在服务端。

  2. 存取方式的不同
    Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
    而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

  3. 安全性(隐私策略)的不同
    Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。

  4. 有效期上的不同
    只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。

  5. 跨域支持上的不同
    Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。

  6. 对服务器造成的压力不同
    Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。