菜菜哥,告诉你一个秘密,可是不容许告诉任何人web
这么秘密,你有男票了?~面试
不是,昨天我偷偷去面试了,结果挂了redis
这不是好事吗,上天让公司留住你.....sql
好吧,不过仍是要请教你一个问题,cookie和session有什么相同和不一样吗?跨域
这个可能要讲很长时间浏览器
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(一般通过加密)安全
Session:在计算机中,尤为是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。服务器
很简短的两段定义,可是已经道出了cookie和session本质的区别,一个位于客户端,一个位于服务端。这个特性带着浓重的色彩,实际中的应用都离不开这个定义。cookie
若是抛开其余特性来讲,cookie本质上是浏览器(http请求)提供的一种客户端存储的数据,可是这个存储数据有本身的一些特性,好比:cookie长度的限制,跨域的限制(固然能够在服务端配合的状况下的突破这种限制)等。就像全部的存储同样,cookie也能够保存在内存中,也能够保存在磁盘中,只不过保存在磁盘的时候是在浏览器的存储目录下,毕竟cookie是基于http的,http请求又基于浏览器。网络
session在不少状况下被称为会话,本质上是一种服务端的存储数据。诞生的主要缘由是为了解决http无状态这种特性。既然是数据,其实就能够存储于任何介质中,像实际应用中,有存储于内存中的,也有存储于redis的。因此只要看透了它的本质,存储在哪里可能就只是一个驱动的问题了。其实彻底能够本身写一个程序把session的数据存储在txt中,只不过性能上可能须要多加考虑。
cookie
当用户第一次访问并登录一个网站的时候,cookie的设置以及发送会经历如下4个步骤:
1. 客户端发送一个请求到服务器 --》
2. 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》
3. 客户端保存cookie,以后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》
4. 服务器返回响应数据
set-cookie: session=4a0b9b1cce73c469b8a6b6a8aec294d5; domain=.xx.com; path=/; expires=Sun, 25 Aug 2019 08:21:27 -0000; secure; HttpOnly
以上过程很明显是一个最多见的场景,cookie的特性以及值是由服务端来下发,可是不要忘记cookie本质上是一种客户端技术,因此客户端其实一样能操做cookie,好比:登陆的时候服务端的返回结果中能够不包含set-cookie的头部,而是把值经过正文来返回,客户端脚本经过读取返回的正文解析出结果,而后写入cookie一样能达到相同的效果。set-cookie只不过是http协议中已经约定好的格式,服务端告诉客户端须要设置cookie的协议而已。固然cookie还有其余不少特性(可能随着发展有所增长或者减小):
属性 | 介绍 |
---|---|
name | name字段为一个cookie的名称 |
value | value字段为一个cookie的值 |
domain | 能够访问此cookie的域名 |
path | 能够访问此cookie的页面路径 |
expires/Max-Age | 此cookie超时时间。 |
Size | Size字段 此cookie大小 |
http | cookie的httponly属性 |
secure | 设置是否只能经过https来传递此条cookie |
因为浏览器的安全策略,不一样域名(何为不一样域名,请百度)的cookie是不容许的,可是能够经过服务端的配置能够解决这个问题。
session
session的建立目的初衷就是为了让服务端记住会话,简而言之就是让服务端能识别出来是哪一个客户端,既然要记住,那服务端必需要存储每一个会话的数据,好比:实际项目中最经常使用的用户信息等。服务端存储这些用户数据没问题,最大的一个障碍是怎么样识别诸多请求中哪些是同一个会话。要解决这个问题,只依靠服务端没法解决,必须须要客户端来配合:须要上传会话的标识。
客户端上传会话的标识,必须是客户端和服务端都能支持的协议和数据,其实也能够看作是http请求支持的协议和数据,既然是基于http请求,最方便的就是利用cookie,cookie是一种key-value的数据存储格式,value的值正适合做为session的标识(session也是一种key-value的存储),在这种状况下cookie终于和session有了必定的联系。
session机制利用cookie来做为标识的传输机制,并不意味着只能用cookie,只要是服务端和客户端约定好了位置,session标识我能够放到http请求的任何位置(固然http请求必须得支持传输才能够)。你彻底能够把session的标识放到http头Authorization字段,只要服务端能正确的读到此值而且正确解析便可。
有些面试官喜欢问cookie和session的相同和不一样,甚至他们的联系,这样的提问在某种程度上是不太好的,容易让人错误的认为cookie和session的联系很密切,可是其实他们的联系很单纯,纯洁的朋友利用关系。
此文篇幅属于5分钟系列,更能有效利用碎片化时间,下一篇,咱们也许能够讨论一下基于cookie和session的认证
完