在技术面试中,经常被问到“Cookie和Session的区别”,大家都知道一些,Session比Cookie安全,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,恐怕就不怎么清楚了。
什么是HTTP
首先要先介绍什么是HTTP
HTTP 是无状态协议,说明它不能以状态来区分和管理请求和响应。也就是说,服务器单从网络连接上无从知道客户身份。
可是怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
1.Cookie
什么是cookie
Cookie翻译过来是‘ 小甜饼’,Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,实际上Cookie是服务器在本地机器上存储的一小段文本,并随着每次请求发送到服务器。
Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据响应报文里的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下客户端再向服务端发起请求时,客户端会自动在请求报文中加入Cookie值之后发送出去.
之后服务端发现客户端发送过来的Cookie后,会检查是那个客户端发送过来的请求,然后对服务器上的记录,最后得到了之前的状态信息。
” data-src=”https://user-gold-cdn.xitu.io/2018/3/13/1621f0b5f29d7f7c?imageView2/0/w/1280/h/960/format/webp/ignore-error/1″ data-width=”832″ data-height=”376″ />
客户端保存了Cookie之后的发起请求
” data-src=”https://user-gold-cdn.xitu.io/2018/3/13/1621f13fade59484?imageView2/0/w/1280/h/960/format/webp/ignore-error/1″ data-width=”764″ data-height=”380″ />
” data-src=”https://user-gold-cdn.xitu.io/2018/3/13/1621f407b4b82236?imageView2/0/w/1280/h/960/format/webp/ignore-error/1″ data-width=”873″ data-height=”602″ />
上图很清晰地展示了发生Cookie 交互的情景,HTTP 请求报文和响应报文的内容如图所示。
第一可以很明显的可出首部字段内没有Cookie的相关信息,其次也能看到set-Cookie里的信息,这就是服务器端生撑的Cookei信息。
” data-src=”https://user-gold-cdn.xitu.io/2018/3/13/1621f4051a540bbb?imageView2/0/w/1280/h/960/format/webp/ignore-error/1″ data-width=”1038″ data-height=”539″ />
看之后请求,请求报文里都自动发送Cookie信息了。
set-Cookie的字段的属性
Set-Cookie: logcookie=3qjj; expires=Wed, 13-Mar-2019 12:08:53 GMT; Max-Age=31536000; path=/;
domain=fafa.com;secure; HttpOnly;
以上面的set-cookie的例子,说一下set-cookie的属性
1.logcookie=3qjj
赋予Cookie的名称和值,logcookie是名字 ,3qjj是值
2.expires 是设置cookie有效期。当省略expires属性时,Cookie仅在关闭浏览器之前有效。可以通过覆盖已过期的Cookie,设置这个Cookie的过期时间是过去的时间,实现对客户端Cookie 的实质性删除操作。
3.path 是限制指定Cookie 的发送范围的文件目录。不过另有办法可避开这项限制,看来对其作为安全机制的效果不能抱有期待。
4.domain 通过domain属性指定的域名可以做到与结尾匹配一致。比如,指定domain是fafa.com,除了fafa.com那么www.fafa.com等都可以发送Cookie。
5.secure 设置web页面只有在HTTPS安全连接时,才可以发送Cookie。HHTP则不可以进行回收。
6.HttpOnly 它使JavaScript 脚本无法获得Cookie,通过上述设置,通常从Web 页面内还可以对Cookie 进行读取操作。但使用JavaScript 的document.cookie 就无法读取附加HttpOnly 属性后的Cookie 的内容了
2.Session管理和Cookie应用
什么是Session
上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。
PHP中的Session在默认情况下是使用客户端的Cookie来保存Session ID的,所以当客户端的cookie出现问题的时候就会影响Session了。必须注意的是:Session不一定必须依赖Cookie,这也是Session相比Cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把Session ID附着在URL中,这样再通过Session ID就能跨页使用Session变量了。
1.客户端把信息放入报文的实体部分,通常是以POST 方法把请求发送给服务器。
2.服务器会发放用以识别用户的Session ID。通过验证从客户端发送过来的信息进行验证,然后把用户的认证状态与Session ID 绑定后记录在服务器端。向客户端返回响应时,会在首部字段Set-Cookie 内写入Session ID(如PHPSESSID=l128ogl…)。你可以把Session ID 想象成一种用以区分不同用户的唯一Id。
步骤三:客户端接收到从服务器端发来的Session ID 后,会将其作为Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送Cookie,所以Session ID 也随之发送到服务器。服务器端可通过验证接收到的Session ID 验证状态。
3.Cookie与Session的区别
- cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上,但是服务端的session的实现对客户端的cookie有依赖关系的;
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
作者:Fysddsw_lc
链接:https://juejin.im/post/5aa783b76fb9a028d663d70a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。