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
- 服务器端给客户端发送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);
});
- 使用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的区别
-
存放位置不同
Cookie保存在客户端,Session保存在服务端。 -
存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。 -
安全性(隐私策略)的不同
Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。 -
有效期上的不同
只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。 -
跨域支持上的不同
Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 -
对服务器造成的压力不同
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。