深入了解 HTTP、cookie、session

    科技2022-07-11  95

    Http协议

    超文本传输协议(HTTP,Hyper Text Transfer Protocol)是互联网上应用最为广泛的一种网络协议。是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)。

    Http协议的版本:

    HTTP/1.0, 发送请求,创建一次连接,获得一个web资源,连接断开(在最早的 http 协议中,每进行一次 http 通信,就需要做一次 tcp 的连接。而一次连接需要进 行 3 次握手,这种通信方式会增加通信量的开销)

    HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。在 HTTP/1.1 中改用了持久连接,就是在一次连接建立之后,只要客户端或者服务端没有 明确提出断开连接,那么这个 tcp 连接会一直保持连接状态 持久连接的一个最大的好处是:大大减少了连接的建立以及关闭时延。 HTTP1.1 中有一个 Transport 段。会携带一个 Connection:Keep-Alive,表示希望将此条连接作为持久连接。

    HTTP协议的主要特点

    1.支持客户/服务器模式。(c/s)

    2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有:

    GET:获取资源
    POST:传输实体主体
    PUT:传输文件
    HEAD: 获得报文首部(相当于GET方法获得的资源去掉正文)
    DELETE: 删除文件
    OPTIONS: 询问支持的方法(客户端问服务器)
    TRACE: 追踪路径
    CONNECT:要求用隧道协议连接代理。

    每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    5.无状态:HTTP协议是无状态协议。

    无状态是指协议对于事务处理没有记忆能力。对同一个url请求没有上下文关系,每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况。服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器。另一方面,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

    会话跟踪

    在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户张三在商场购买的任何商品都应该放在张三的购物车内,不论是用户张三什么时间购买的,这都是属于同一个会话的,不能放入用户李四或用户牛二的购物车内,这不属于同一个会话。 而Web应用程序是使用HTTP协议传输数据的。HTTP 协议是无状态的,什么是无状态呢?通俗来讲就是说http协议一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。 但是现在的应用程序都是有状态的,如果是无状态,那这些应用基本没人用,你想想,访问一个电商网站,先登录,然后去选购商品,当点击一个商品加入购物车以后又提示你登录。

    每一次操作都要与系统底层的数据库进行交互

    这种繁杂、冗余的用户体验根本不会有人去使用,那我们是如何实现带状态的协议呢?所以此时便引入了cookie和session两个概念!

    常用的会话跟踪技术是Cookie与Session。

    Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

    1、客户端支持的 cookie

    Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话

    <1>什么是Cookie?

    Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、google、Netscape、Firefox、Opera等都支持Cookie。

    <2>Cookie的工作原理:

    由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论是谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修Cookie的内容。

    2、服务端支持的 session

    除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

    <1>什么是session?

    Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存客户端信息。 客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了,这就是Session。

    为每个访问服务器的用户创建一个存储数据的容器,容器中的数据在多个请求之间共享;通过在服务器端开辟一块缓存区,存储、记忆、共享一些临时数据(这个数据指的是客户端和服务器在临时会话中产生的数据)

    <2>session的工作原理

    如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 ——称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

    最后是我个人的一些总结,花了半天的时间研究了一下http协议以及cookie、和session的概念原理。

    http协议本身是无状态的,只是后来随着互联网的发展以及电商平台的普及,越来越多的web应用程序出现,为了顺应与人交互的便捷化,这两个非正式协议的机制便被引入到http中,其实这两种机制很久以前就已经存在(cookie是1993年提出,session暂不清楚)

    cookie:默认情况下,当浏览器关闭后,Cookie数据被销毁

    session:可以认为是服务器端开辟的一小块缓冲空间

    举一个很贴近生活的例子,一般大部分小区都会有保安看守,想进小区无非不过就两种方法:

    一、拥有你自己的身份证明,能证明你是小区里的人,拿给保安看。

    二、让保安查询对应的小区出入信息登记表,核对身份后,方可进入。

    这里的第一点就好比你自己的cookie,第二点里的登记表就好比小区为业主为专门设置的缓冲区(或者说记录表),也就是session。

    本人小白,第一次发文,以上均为个人见解,如有不严谨的地方还望各位不吝赐教!

    参考文链接:cookie

    Processed: 0.010, SQL: 8