对Cookie和Session的理解

**Cookie和Session不同层次的理解**
	
	第一层
	
	什么是 Cookie 和 Session ?(初级程序员面试常问)

	什么是Cookie?
	Http Cookie(也叫Web Cookie或者浏览器 Cookie),是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成了可能。
	Cookie主要用于以下几个方面:
		1、会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息);
		2、个性化设置(如用户自定义设置、主题等)
		3、浏览器行为跟踪(如跟踪分析用户行为等)
	
	什么是Session?
	Session代表着服务器和客户端一次会话的过程。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者Session超时失效时,会话结束。

	第二层
	
	Cookie和Session有什么不同?
		1、作用范围不同:Cookie保存在客户端(浏览器),Session保存在服务器端。
		2、存取方式不同,Cookie只能保存ASCII,Session可以存任何数据类型。一般情况下,我们可以在Session中保存一些常用变量信息,比如说UserId等。
		3、有效期不同,Cookie可设置为长时间保持,比如我们经常使用的默认登录功能;Session一般失效时间较短,客户端关闭或者Session超时都会失效。
		4、隐私策略不同,Cookie存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在Cookie中导致信息被窃取;Session存储在服务端,安全性相对Cookie要好一些。
		5、存储大小不同,单个Cookie保存的数据不能超过4K,Session可存储数据远高于Cookie。


	第三层

	为什么需要Cookie和Session,他们有什么关联?
	
	为什么需要Cookie,这就要从浏览器说起,我们都知道浏览器是没有状态的(HTTP协议无状态),这就意味浏览器并不知道是张三还是李四在和服务器打交道。这时候就需要一个机制来告诉服务端,本次操作用户是否登录,是哪个用户在执行的操作。这个机制需要Cookie和Session的配合。
	Cookie和Session的配合:

在这里插入图片描述 用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的Session,请求返回时将此Session的唯一标识信息SessionID返回给浏览器。浏览器获得这个SessionID后,会将此信息存入到Cookie中,同时Cookie记录此SessionID属于哪个域名。
当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在Cookie信息,如果存在自动将Cookie信息也发送给服务端,服务端会从Cookie中获取SessionID,再根据SessionID查找对应的Session信息,如果没有找到说明用户没有登录或者登录失败;如果找到了Session证明用户已经登录了,可以执行后面的操作。
根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

	第四层
	
	服务端是根据Cookie中的信息判断用户是否登录,那么如果浏览器中禁止了Cookie。如何保障整个机制的正常运转?
	
	第一种方案,每次请求中都携带一个SessionID参数,也可以Post的方式提交,也可以在请求的地址后面拼接xxx?SessionID=123456...。
	
	第二种方案,Token机制。Token机制多用于App客户端和服务器交互模式,也可以用于Web端做用户状态管理。
	
	Token 的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。Token 机制和 Cookie 和 Session 的使用机制比较类似。
	当用户第一次登录后,服务器根据提交的用户信息生成一个 Token,响应时将 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次登录验证。

	第五层
	
	如何考虑分布式 Session 问题?
	在互联网公司为了可以支撑更大的流量,后端往往需要多台服务器共同来支撑前端用户请求,那如果用户在 A 服务器登录了,第二次请求跑到服务 B 就会出现登录失效问题。
	分布式 Session 一般会有以下几种解决方案:
	1、Nginx ip_hash策略。服务端使用Nginx代理,每个请求按访问IP的hash分配,这样来自同一IP固定访问一个后台服务器,避免了在服务端A创建Session,第二次分发到服务器B的现象。
	2、Session复制,任何一个服务器上的Session发生改变(增删改),该节点会把这个Session的所有内容序列化,然后广播到其它所有节点。
	**3、共享Session,服务端无状态化,将用户的Session等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。**

	第六层
	
	如何解决跨域请求?Jsonp跨域的原理是什么?
	
	说起跨域请求,必须要了解浏览器的同源策略,同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到 XSS、CSFR 等攻击。所谓同源是指“协议+域名+端口”三者相同,即使两个不同的域名指向听一个IP地址,也非同源。
	
	解决跨域请求的常用方法是:
	1、通过代理来避免,比如使用 Nginx 在后端转发请求,避免了前端出现跨域的问题。
	2、通过 Jsonp 跨域
	3、其它跨域解决方案

	重点谈一下 Jsonp 跨域原理。浏览器的同源策略把跨域请求都禁止了,但是页面中的 <script><img><iframe>标签是例外,不受同源策略限制。Jsonp 就是利用 <script> 标签跨域特性进行跨域数据访问。
	JSONP 的理念就是,与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段 Javascript,在这段 Javascript 代码中调用了约定好的回调函数,并且将数据作为参数进行传递。当网页接收到这段 Javascript 代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了。
	JSONP 的缺点是:它只支持 GET 请求,而不支持 POST 请求等其他类型的 HTTP 请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值