Cookie与Session

**Cookie **是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它可以记录你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,例如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等。
** Session **存储在服务器端,一般放在服务器的内存中。Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

1.Cookie的设置与发送过程

Paste_Image.png

一个cookie的设置以及发送过程分为以下四步:
(1)客户端发送一个http请求到服务器端
(2)服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
(3)客户端发送一个http请求到服务器端,其中包含Cookie头部
(4)服务器端发送一个http响应到客户端

Paste_Image.png

查看笔记功能:

Paste_Image.png

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)

Paste_Image.png
Paste_Image.png
Paste_Image.png

编写如下程序:


Paste_Image.png

首先调用read,没有相应的cookie信息。

Paste_Image.png

调用write,可以看到response中有set-Cookie

Paste_Image.png

再次调用read,可以看到resquest中附带了,之前设置的cookie信息。

Paste_Image.png

Paste_Image.png

3、设置Cookie中的域名
缺省为当前域名

Paste_Image.png

首先清除该域名下的所有cookie。

Paste_Image.png

调用write,设置cookie

Paste_Image.png

调用read,没有cookie信息,因为域名不一致。

Paste_Image.png

在客户端通过修改host文件,来模拟一个域名

Paste_Image.png

再次调用write,设置cookie。

Paste_Image.png

调用read,可以看到cookie信息。

Paste_Image.png

Paste_Image.png

4、设置Cookie的Path
缺省为"/"

Paste_Image.png

首先清除该域名下的所有cookie。
调用write,设置cookie,path='/abc'

Paste_Image.png
Paste_Image.png

调用abc,可以看到cookie信息。

Paste_Image.png

Paste_Image.png

5、设置Cookie的Expires
该值缺省为:session ;浏览器关闭后失效

Paste_Image.png

调用write,设置cookie,失效时间为2分钟。

Paste_Image.png

上面的时间中,GMT的含义是格林尼治标准时间。

调用read

Paste_Image.png
Paste_Image.png

2分钟后调用read,已经没有cookie信息了。

Paste_Image.png
Paste_Image.png

通过maxAge设置Cookie失效时间

Paste_Image.png

Paste_Image.png

6、设置Cookie的 httponly
缺省为false

Paste_Image.png

调用write,设置Cookie

Paste_Image.png

下面通过脚本来读取cookie,只能读出a的值。

Paste_Image.png

可以修改未设置为httponly的数据。

Paste_Image.png
Paste_Image.png
Paste_Image.png

Paste_Image.png

6、设置Cookie的signed
对cookie的值进行签名,防止用户篡改其值

Paste_Image.png

b已经被签名

Paste_Image.png

签名的数据在req.signedCookies中。

Paste_Image.png
Paste_Image.png

可以使用unescape进行解码。

Paste_Image.png
Paste_Image.png

8、Cookie可能存在的问题:

(1)浏览器向服务器发起的每个请求都会带上cookie;加大了网络流量。
(2)在客户端,Cookie会存在本地计算机中,存在安全隐患;
(3)http协议本身是是无状态的,但是现代站点很多都需要维持登录态,也就是维持会话。因此可能会把用户的信息存储在Cookie中;
(4)有些服务器对请求头的大小有限制。

Paste_Image.png

2、安全性问题:
(1)伪造Cookie:可以采用加密的方式防止伪造。
Cookie截获:使用Https协议。
(2)跨站脚本攻击(Cross Site Scripting,常简写作XSS),可以借助httpOnly属性来防止该攻击。
(3)Cookie截获:使用Https协议。

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • cookie cookie的起源 早期web刚开始出现复杂的应用程序时,产生了对于能够直接在客户端上存储用户信息能...
    zenggo阅读 9,283评论 1 52
  • Cookie与Session详解读书笔记,从概念、操作、应用、注意事项以及区别等几方面详细阐述两者的基础知识,它们...
    奋斗live阅读 4,705评论 0 2
  • 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Se...
    舍末逐本阅读 2,669评论 0 0
  • 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Se...
    HyacinthC阅读 1,384评论 0 2
  • 什么更好——廉价的幸福好呢,还是崇高的痛苦好?——陀思妥耶夫斯基 桌布——苍蝇的斗篷 五颜六色的唾沫 攀爬...
    子健阅读 3,352评论 3 5