HTTP-Cookie和Session
一.Cookie
1.什么是Cookie
Cookie是存储在用户浏览器中的一小段数据,由网站创建,用来保存用户的一些信息,比如登录状态、偏好设置、购物车内容等。
2.为什么需要Cookie
HTTP协议自身是属于“无状态”协议,无状态是只默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有之间的联系。
每次请求都是独立的,互补关联的,服务器不会自动保存任何“历史记录”。
当第一次访问一个网页,服务器在处理完后就会“忘记你是谁”,等到第二次访问的时候,服务器当你是“新来的”。
但是在实际的开发中,很多时候是不希望这样的。
此时就需要才请求的时候额外提供一些信息,比如Cookie。
此时将这些信息保存在哪里成了一个问题,最容易想到的就是将这些信息保存在本地文件中,但是这个行为是不可行的,浏览器为了安全,禁止网页直接访问电脑的本地文件系统,此时网页代码也就无法直接使用本地文件来存储信息了。
此时为了既可以保证安全性,又可以进行存储数据,浏览器引入了Cookie,这种方式也是按照硬盘文件的方式来保存的,但是浏览器将操作文件给封装了,网页只能往Cookie中存储。
3.Cookie的工作流程
服务创建Cookie:
当用户首次访问网址时,服务器会通过响应头中的Set-Cookie字段向浏览器发送一个Cookie。
浏览器保存Cookie:
浏览器携带Cookie请求:
用户再次访问同一个网站时,浏览器会在请求头中携带Cookie给服务器 。
此时如果将Cookie删除之间访问,图书列表页面,会被登入拦截的:
4.Cookie的局限性
大小限制:通常每个Cookie不超过4kb。
数量限制:每个域名最多能存储大约20-50个Cookie。
安全性较弱:明文存储,容易被窃取(特别是未设置HttpOnly,Secure)。
不能跨域共享:一个域的Cookie不能被另一个域访问。
二.Session
1.什么是会话
在计算机领域中,会话是一个客户端和服务器之间不中断的请求响应,对客户端的每个请求,服务器能够识别出请求来自于那个客户端。当一个未知的客户端向Web应用程序发送第一个请求时就创建了一个会话。当客户端明确结束会话或服务器在一个时限内没有接收到客户的任何请求时,会话就结束了。
2.什么是Session
服务器在同一时刻收到的请求是很多的。服务器需要清楚的区分每个请求是属于那个客户端的,也就是属于那个会话的,此时就需要在服务器这边记录每个会话以及于客户端的的信息的对应关系。
Session是服务器为了保存用户信息而创建的一个特殊的对象。
Cookie可以被理解为,如果没有Cookie,学生就好比没有学生证,每次在进入小梦的时候都会被拦截,Cookie就像学生手里的学生证一样,标识这这个学生是这个学校的学生。
而Session就让保安记住学生的信息,每次学生出示了学生证保安就可以知道这个学生是这个学校的学生,就会放学生进去。
Session的本质就是一个“哈希表”,存储了一些键值对结构,Key就是SessionID,Value就是用户信息(用户信息可以根据需求灵活设计)。
当服务器生成了唯一的SessionID后会,让将这个唯一的Key发送给浏览器,让浏览器保存到Cookie中, 也就说明了Cookie中还保存着客户端的其他信息。
3.Session的工作流程
当用户第一次访问服务器的时候,服务器会创建一个Session(保存在内存或数据库中,默认是保存在内存中的,如果重启服务器是会丢失的),然后服务器会生成一个唯一的SessionID,并通过Set-Cookie发送给浏览器。
浏览器保存这个SessionID。
用户后续每次请求,浏览器会自动携带该SessionID。
服务器通过SessionID找到对应的Session对象,获取用户状态。
三.Cookie和Session的区别
1.Cookie是客户端保存用户信息的一种机制。Session是服务器端保存用户信息的一种机制。
2.Cookie和Session之间主要是通过SessionID关联起来的,SessionID是Cookie和Session之间的桥梁。
3.Cookie和Session经常会一起搭配使用,但不是必须配合的。
完全可以用Cookie来保存一些数据在客户端。这些数据不一定是用户身份信息,也不一定是SessionID。
Session中的SessionID也不需要非得通过Cookie/Set-Cookie传递,通过URL传递也可以。