对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);

在这里插入图片描述
2. 使用cookie-parser中间件读取cookie

const express = require('express');
const cookieParser = require('cookie-parser');
let server = new express();
server.listen(8084);
//这一步是重点
server.use(cookieParser());

server.get('/',function (req,res) {   
	 res.cookie('name','xixi',{        
	 	path:'/',//访问哪一个路径的时加上cookie        
	 	maxAge:20*60*1000,//cookie的存活时间,单位毫秒 
	 });  
	 console.log('没有签名的cookie:',req.cookies);    //{ user: '163' }
	 console.log('签名后的cookie:',req.signedCookies);    //[Object: null prototype] {}
	 res.send(req.cookies);
});
  1. 使用cookie-parser对cookie进行签名以及读取签名后的cookie
    因为cookie不够安全,所以我们需要对cookie进行签名,然后把签名的值传到cookie-parser内部再进行修改。(signed:true),在获取的时候,我们需要告诉req,我们需要的是签名之后的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) {   
	 req.secret='aass';    
	 //我们可以把这一步省略,因为在cookieParser中间件中已经有req.secret = secret(cookieParser中传入的值)了,所以说,假如这个值与cookieParser中传入的值不同,这个值会被覆盖掉。
	 res.cookie('name','xixi',{        
	 	path:'/',//访问哪一个路径的时加上cookie        
	 	maxAge:20*60*1000,//cookie的存活时间,单位毫秒        
	 	signed:true//是否加签名
	 });  
	 console.log('没有签名的cookie:',req.cookies);    //[Object: null prototype]
	 console.log('签名后的cookie:',req.signedCookies);    { user: '163' }
	 res.send(req.cookies);
});

这是在浏览器中设置了签名的cookie
在这里插入图片描述
这是在服务器读取到的签名后的cookie
在这里插入图片描述
而且我注意到,新设置的同名cookie,会把原来的cookie覆盖掉。
4. 清除cookie

res.clearCookie('name')

7.cookie的两种类型

  • 临时Cookie(会话Cookie)
    不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
  • 永久Cookie
    设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。

8.关于cookie的一些补充

  • res设置cookie, req识别cookie。
  • cookie是可跨域的,只要把domain设为某些域名的后缀,后缀为该domain的域名都共享这个cookie。
  • 浏览器的同源策略
    • URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。

    • 对于 Cookie 来说,Cookie 的同源只关注域名,是忽略协议和端口的。所以一般情况下,https://localhost:80/ 和 http://localhost:8080/的 Cookie 是共享的。

  • 数量限制:浏览器对于Cookie在数量上是有限制的,如果超过了自然会有一些剔除策略。最近最少使用(LRU)方法:在达到cookie限制时自动地剔除最老的cookie,以便腾出空间给最新的cookie。Internet Explorer和Opera使用这种方法。Firefox决定随机删除Cookie集中的一个Cookie,并没有什么章法。

9.如何用cookie保持登录

后台随机生成一段字符串,在发送给前端的时候,顺便以对象的形式存入数据库,前端在发起请求的时候携带cookie,后台验证前端发送过来的cookie,这样就不容易造假。session就是差不多这样的机制,我们可以使用session来管理cookie。

session

什么是session

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

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

为什么要使用session

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

那么问题来了,既然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('这段签名的字符串可以是随意的'));
/因为session不是独立存在的,是基于cookie的,所以仍然需要解析cookie的工具
//session是必须加入签名的,如果没加签名的话,系统会报错,告诉你Error:.required for signed cookies

(function(){    
	var arr = [];    
	for(var i = 0;i<10000;i++){ 
	    arr.push('keys_'+Math.random());   
 	}
 	server.use(cookieSession({ 
 	    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('这不是第一次访问'); 
}});

对session的理解

session是一个对象,以键值对的形式存储信息。当客户端请求成功之后,服务端会把把session_id通过cookie的形式发送给客户端。客户端之后再像服务器端发起请求,会自动携带session_id,服务器端会自动验证session_id,如果req.session里面有值,那么就说明session_id通过了验证。

隐患:session劫持

因为session_id是以cookie的形式存储在客户端的,所以就会有被篡改的风险。如果b拿到了a的session_id,b再用其登陆网站,那么就是以a的身份在访问这个网站了。
解决:定期更换session_id,提高cookie的安全性。

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是很好的选择。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值