详解Cookie和Session的区别

详解Cookie和Session的区别

Cookie的定义

Cookie,又称为“小甜饼”。类型为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。

Cookie的分类

Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie硬盘Cookie

  • 内存Cookie

    由浏览器维护,存储在内存中,浏览器一关闭就消失了,其存在时间是短暂的。

  • 硬盘Cookie

    保存在硬盘中,有过期时间,除非用户手工清理或者到了过期时间,否则硬盘Cookie不会被删除,其存在时间是长久的。

所以按存在时间,又可分为非持久Cookie持久Cookie

Cookie的机制

  1. 客户端发送请求至服务器,包含一系列信息:比如名字,年龄,ID号码等等;
  2. 服务器将这些信息(比如名字,年龄,ID号码等等)保存在cookie中,通过响应将cookies发送至浏览器;
  3. 浏览器在本地存储这些信息,以备不时之需;
  4. 当下一次浏览器发送任何请求至服务器时,它会同时将这些cookies信息发送给服务器(cookie附在请求资源的HTTP请求头上发送给服务器。),然后服务器使用这些信息来识别用户或者干些其它事情。

cookie原理示意图

Cookie的用途

  • 内存Cookie

    因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

    在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

  • 硬盘Cookie

    Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

Cookie的缺陷

  1. Cookie被附加在每一个HTTP请求中,这无形中增加了流量;
  2. Cookie在HTTP中是明文传递的,所以是不安全的,除非使用HTTPS;
  3. Cookie的限制大小为4KB左右,对于复杂的存储需求是不够用的。

-----------------------------

Session的定义

  • 我们都知道Session翻译成中文就是会话的意思

  • 那么,什么是会话?

    用户打开一个浏览器,点击多个超链接,访问服务器多个Web资源,然后关闭浏览器,整个过程称之为一个会话。

  • 但其实会话和Cookie并不是同一层次的东西,而我们要讲的Session则是和cookie是同一层次的东西。

  • 所以什么是session?

    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

Session机制

  • 当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为sessionID),如果已包含则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionID,则为此客户端创建一个session并且生成一个与此session相关联的sessionID,sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionID将被在本次响应中返回给客户端保存。

    img

  • 保存这个sessionID的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于sessionID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session ID传递回服务器,可以使用URL重写(通过URL传递session ID)。

Cookie和Session的异同

  • 共同点:

    两者都是保存会话数据的技术,session同样可以实现“购物车“功能,实际上大多数的应用都是用cookie来实现session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

  • 不同点:

  1. 存取方式的不同
    Cookie中只能保管ASCII字符串,假如需要存取Unicode字符或者二进制数据,需要先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比较艰难的。而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管JavaBean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

  2. 隐私策略的不同
    Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只有本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。

  3. 有效期上的不同
    使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。由于Session依赖于名为JSESSIONID的Cookie,而Cookie的JSESSIONID的过期时间默许为–1,只需关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易导致内存溢出。

  4. 服务器压力的不同
    Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。而Cookie保管在客户端,不占用服务器资源。假如并发使用的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。

  5. 浏览器支持情况不同
    Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。关于WAP应用来说,Session+URL地址重写或许是它唯一的选择。假如客户端支持Cookie,则Cookie既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为–1),也能够设为一切阅读器窗口内有效(把过期时间设为某个大于0的整数)。但Session只能在本阅读器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session.

  6. 跨域支持上的不同
    Cookie支持跨域名访问,例如将domain属性设置为.biaodianfu.com,则以.biaodianfu.com为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。

  7. 存储位置不同

    Cookie保存在客户端,而Session保存在服务器。

  8. 存储容量不同

    Cookie的大小限制为4KB左右而且浏览器存储Cookie的个数也有限制,Session没有大小限制主要和服务器的内存大小有关。

网站应该如何选择呢

  1. Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。并发访问量极高的网站,是不太可能运用Session来追踪客户会话的;
  2. Cookie保管在客户端,不占用服务器资源。假如并发访问的用户十分多,Cookie是很好的选择。

参考资料

  1. 知乎:https://www.zhihu.com/question/19786827
  2. 维基百科:https://zh.wikipedia.org/wiki/Cookie
  3. CSDN:https://blog.csdn.net/yiguang_820/article/details/83031922
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值