HTTP协议之Cookie
- 使用Cookie的原因
- Cookie的定义
- 客户端和服务器的Cookie
- 客户端发送请求报文的Cookie
- 服务器端响应报文的set-cookie
- Cookie的通信
使用Cookie的原因
因为HTTP协议是无连接无状态的协议,这虽然带来了速度上的提升和结构上的简洁,但是有许多应用场景需要进行有状态的连接,比如我在一个网站上登录了,点击一个本站链接,跳转到详情的页面,这时,用户肯定希望保持登录的状态,因此,我们需要引入 Cookie 来为HTTP协议添加状态管理功能。
Cookie的定义
Cookie是指在HTTP协议下,服务器或脚本可以维护客户端计算机上信息的一种方式。通俗地说,Cookie是一种能够让网站Web服务器把少量数据储存到客户端的硬盘或内存里,或是从客户端的硬盘里读取数据的一种技术。Cookie文件记录了用户的有关信息,如身份识别号码ID、密码、浏览过的网页、停留的时间、用户在Web站点购物的方式或用户访问该站点的次数等,当用户再次链接Web服务器时,浏览器读取Cookie信息并传递给Web站点。
客户端和服务器的Cookie
** 客户端发送请求报文的Cookie**
如果客户端没有Cookie时,在其请求报文中不会有Cookie字段,若已经有Cookie,再访问对应网站时,浏览器会检索是否有Cookie与此网站对应,若对应,则服务器可读取次Cookie记录的信息。 请求报文中的Cookie字段只有:
Cookie:status = enable(disable)
服务器端响应报文的set-cookie
服务器若发现请求报文中没有Cookie字段,则会在response报文中加入 Set-Cookie 字段,格式为:
Set-Cookie: NAME = VALUE; expires = DATE; path = PATH; domain = www.xxx.com; Secure; HttpOnly
上面的全大写变量为自定义变量,我们需要定义Cookie的名称,并对其赋值,若是多键值对的情况,格式为NAME = KEY1 = VALUE1 & KEY2 = VALUE2;expires为Cookie失效的时间,默认为关闭浏览器后清理;path为服务器定义的Cookie存储路径;domain为网站的域,若www.baidu.com,他的域应该为baidu.com/*,即主页及其次级目录;Secure若出现,意味着仅在https通信时发 送Cookie;HttpOnly若出现,意味着只能在HTTP协议中访问Cookie,不能在Javascript中访问Cookie。
Cookie的通信
如图所示,这是一个标准的Cookie通信过程。没有Cookie的客户端对服务器发起请求,服务器发现请求报文首部中没有Cookie字段,就在response报文中加入Set-Cookie字段,客户端接收到之后,在本地生成Cookie,并在再次发生http访问时,在request报文中加入Cookie字段,于是服务器就会知道用户的一些信息,用来进行个性化和定制化的操作。