**Cookie **是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它可以记录你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,例如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等。
** Session **存储在服务器端,一般放在服务器的内存中。Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
1.Cookie的设置与发送过程
一个cookie的设置以及发送过程分为以下四步:
(1)客户端发送一个http请求到服务器端
(2)服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
(3)客户端发送一个http请求到服务器端,其中包含Cookie头部
(4)服务器端发送一个http响应到客户端
查看笔记功能:
2、如何防止session超时?
众所周知,当用户登录网站后较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时。
那么,如何解决用户登录后较长时间未操作而导致的session失效的问题呢?
导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。
如果用户未操作的「长时间」超过了服务器配置的session超时时间,并导致session失效,那么我们延长session的超时时间,让用户原来的「长时间」与超时时间相比,变得不「长」,不就可以解决了吗?
如果用户是长时间「未操作」导致session失效,那么我们想办法产生「操作」,让用户每隔一小段时间就「操作」一次,与服务器产生交互,那么session自然也不会失效。
3、Cookie 和Session 的区别与应用
Cookie和session由于实现手段不同,因此也各有优缺点和各自的应用场景:
** 应用场景**
Cookie的典型应用场景是Remember Me服务,即用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,比如页面布局以及搜索历史等等。
Session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景;
安全性
Cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。
Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁。
总体来讲,session的安全性要高于cookie。
性能
Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的;
但是Cookie会增加网络流量。
** 时效性**
Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(也可以通过用户主动销毁session或关闭浏览器后引发超时);
其他
Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了很多。
Cookie基础实验
Cookie的属性如下:
Cookie名称,Cookie名称必须使用只能用在URL中的字符,一般用字母及数字,不能包含特殊字符,如有特殊字符想要转码。如js操作cookie的时候可以使用escape()对名称转码。
Cookie值,Cookie值同理Cookie的名称,可以进行转码和加密。
Expires,过期日期,一个GMT格式的时间,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie在浏览器关闭后消失。
Path,一个路径,在这个路径下面的页面才可以访问该Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。
Domain,子域,指定在该子域下才可以访问Cookie,例如要让Cookie在a.test.com下可以访问,但在b.test.com下不能访问,则可将domain设置成a.test.com。
Secure,安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议既可访问,如果设置了Secure(没有值),则只有当使用https协议连接时cookie才可以被页面访问。
HttpOnly,如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息。
1、初始化项目并安装必要的包
#mkdir cookie
#npm init
#npm npm install express cookie-parser --save
2、编写Cookie程序(设置与读取cookie)
编写如下程序:
首先调用read,没有相应的cookie信息。
调用write,可以看到response中有set-Cookie
再次调用read,可以看到resquest中附带了,之前设置的cookie信息。
3、设置Cookie中的域名
缺省为当前域名
首先清除该域名下的所有cookie。
调用write,设置cookie
调用read,没有cookie信息,因为域名不一致。
在客户端通过修改host文件,来模拟一个域名
再次调用write,设置cookie。
调用read,可以看到cookie信息。
4、设置Cookie的Path
缺省为"/"
首先清除该域名下的所有cookie。
调用write,设置cookie,path='/abc'
调用abc,可以看到cookie信息。
5、设置Cookie的Expires
该值缺省为:session ;浏览器关闭后失效
调用write,设置cookie,失效时间为2分钟。
上面的时间中,GMT的含义是格林尼治标准时间。
调用read
2分钟后调用read,已经没有cookie信息了。
通过maxAge设置Cookie失效时间
6、设置Cookie的 httponly
缺省为false
调用write,设置Cookie
下面通过脚本来读取cookie,只能读出a的值。
可以修改未设置为httponly的数据。
6、设置Cookie的signed
对cookie的值进行签名,防止用户篡改其值
b已经被签名
签名的数据在req.signedCookies中。
可以使用unescape进行解码。
8、Cookie可能存在的问题:
(1)浏览器向服务器发起的每个请求都会带上cookie;加大了网络流量。
(2)在客户端,Cookie会存在本地计算机中,存在安全隐患;
(3)http协议本身是是无状态的,但是现代站点很多都需要维持登录态,也就是维持会话。因此可能会把用户的信息存储在Cookie中;
(4)有些服务器对请求头的大小有限制。
2、安全性问题:
(1)伪造Cookie:可以采用加密的方式防止伪造。
Cookie截获:使用Https协议。
(2)跨站脚本攻击(Cross Site Scripting,常简写作XSS),可以借助httpOnly属性来防止该攻击。
(3)Cookie截获:使用Https协议。