什么是Session和Cookie?
Session和Cookie是用户保持HTTP连接状态的技术。在网页或APP等应用中基本都会使用到。在写爬虫的时候,也经常会涉及需要携带Cookie应对一般的反爬,接下来会对Session和Cookie的基本原理做简要讲解。
Session的基本原理
Session代表服务器与浏览器的遗产会话过程,这个过程可以是连续的,也可以是时断时续的。Session是一种服务器端的机制,Session对象用来存储特定用户会话所需信息。Session由服务器端生成,保存在服务器的内存、缓存、硬盘和数据库中。
Session的基本原理如下:
- 当用户访问一个服务器时,如果服务器启用Session,服务器就要为该用户创建一个Session,在创建Session时,服务器首先检查这个用户发来的请求是否包含了一个SessionID,如果包含了一个Session ID,则说明之前该用户已经登录过并为此用户创建Session,那么服务器就按照这个SessionID 把这个Session在服务器的内存中查找出来(如果查找不到,就有可能新创建一个)。
- 如果客户端请求不包含Session ID , 则为该客户端创建一个Session并生成此Session相关的Session ID。要求这个Session ID是唯一的、不重复的、不容易找到规律的字符串,这个Session ID将在本次响应中返回到客户端保存,而保存这个Session ID的正是Cookie,这样交互过程中浏览器跨域自动地按照规则把这个标识发送给服务器。
Cookie的基本原理
因为HTTP是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结账时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这一点,就需要使用到Cookie。服务器可以设置或读取Cookie中所包含的信息,借此维护服务器与用户的会话状态。
Cookie是由服务器端生成后发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,可以分为内存Cookie和硬盘Cookie。
- 内存Cookie:由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。
- 硬盘Cookie :保存在硬盘中,有一个过期时间,除非用户手动清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间可以分为非持久Cookie和持久化Cookie。
Cookie的基本原理如下:
- 创建Cookie。当用户第一次浏览摸个使用Cookie的网站时,该网站的服务器就进行以下工作。给该用户生成一个唯一的识别码(Cookie),存储在浏览器内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大的时间(maxAge),并给出以秒为单位的时间(其中将最大时效设为0时删除该浏览器的Cookie);然后将Cookie放入HTTP响应报头,将Cookie插入Set-Cookie HTTP请求报头中,最终发送该HTTP响应报头。
- 设计存储Cookie。浏览器收到该响应报头后,根据报文头里的Set-Cookie特殊的指示,生成响应的Cookie。保存在客户端。该Cookie中记录中用户当前的信息。
- 发送Cookie。当用户再次访问该网站时,浏览器会首先检查所存储的Cookie,如果某个存在该网站的Cookie(即该Cookie所声明的作用范围大于等于将要请求的资源),则把该Cookie附在请求资源的HTTP请求头上发送给服务器。
- 读取Cookie。服务器接收到用户请求报文后,从报文头获取到该用户的Cookie,从中找到所需要的内容。
cookie有哪些弊端?
- cookie的数量和长度的限制。每个domain最多只有20条cookie,每个cookie长度不能超过4KB,否则会被截去。
- 安全性问题。如果cookie被人拦截了,拦截者就可以取得所有session消息。即使加密也于事无补,因为拦截者不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。
Session与Cookie的区别
- Session是存储在服务器端的,Cookie是存储在客户端的,所以Session的安全性高于Cooke。
- 因为Session是存储在服务中的,不断增加的Session会增加服务器的负担。所以,我们会把一些重要的东西放在Session中,不太重要的东西放在Cookie中。
- Session在服务器关闭时或Session过期时(默认30分钟)消失;Cookie分为会话Cookie和持久化Cookie,浏览器关闭了,会话Cookie也会消失,持久化Cookie存在于客户端硬盘中,主动删除或Cookie过期时消失。
拓展:只要关闭浏览器,会话就消失了?
在谈论会话机制时,常常有一个误区——“只要关闭浏览器,会话就消失了”。举个银行卡的例子,除非客户主动销卡,否则银行绝对不会轻易销卡删除客户的资料信息。对于会话也是一样,除非程序通知服务器删除一个会话,否则服务器会一直保留。例如,程序一般是我们做注销操作时才会删除会话。
当我们关闭浏览器时,浏览器并不会主动通知服务器它将要关闭,说话会话消失无从说起。之所以会有这种错觉,是因为大部分会话机制都会使用会话Cookie来保存会话ID信息,而关闭浏览器之后Cookie就消失了,再次连接服务器时,也无法找到原来的会话了。如果服务器设置的Cookie保存在营盘山,或者使用某种手段改写HTTP的请求头,把原来的Cookie发送给服务器,再次打开浏览器,仍然能够找到原来的会话ID,依旧可以保持登录状态。
恰恰是因为关闭浏览器不会导致会话删除,这就需要服务器会话设置一个失效时间。当距离客户端上一次使用会话的时间超过这个时效是,服务器可以认为客户端已经停止了活动,才会把会话删除以节省空间。