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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

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