session和cookie的区别cookie与session区别和联系session和cookie的区别总结




session和cookie的区别cookie与session区别和联系session和cookie的区别总结

2022-07-21 2:28:12 网络知识 官方管理员


我在做面试官的时候,曾经问过很多朋友这个问题:Cookie和Session有什么区别呢?大部分的面试者应该都可以说上一两句,比如:什么是Cookie?什么是Session?两者的区别等。

但如果再往深入探讨的话,就慢慢有一些朋友不太了解了,谈起原理时就很少有朋友全部回答准确。今天和大家一起深入聊聊有关Cookie和Session的话题。

第一层楼

什么是Cookie和Session?初级程序员高频面试题。

什么是Cookie

HTTPCookie(也叫WebCookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

Cookie主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

什么是Session

Session代表着服务器和客户端一次会话的过程。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者Session超时失效时会话结束。

第二层楼

Cookie和Session有什么不同?

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

前两层楼内容,绝大部分同学都可以准确回答

第三层楼

为什么需要Cookie和Session,他们有什么关联?

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

那么Cookie和Session是如何配合的呢?我画了一张图大家可以先了解下。

session和cookie的区别(cookie与session区别和联系)(1)

用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建创建对应的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一般会有以下几种解决方案:

  • Nginxip_hash策略,服务端使用Nginx代理,每个请求按访问IP的hash分配,这样来自同一IP固定访问一个后台服务器,避免了在服务器A创建Session,第二次分发到服务器B的现象。
  • Session复制,任何一个服务器上的Session发生改变(增删改),该节点会把这个Session的所有内容序列化,然后广播给所有其它节点。
  • 共享Session,服务端无状态话,将用户的Session等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。

建议采用第三种方案。

第六层楼

如何解决跨域请求?Jsonp跨域的原理是什么?

说起跨域请求,必须要了解浏览器的同源策略,同源策略/SOP(Sameoriginpolicy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

解决跨域请求的常用方法是:

  • 通过代理来避免,比如使用Nginx在后端转发请求,避免了前端出现跨域的问题。
  • 通过Jsonp跨域
  • 其它跨域解决方案

重点谈一下Jsonp跨域原理。浏览器的同源策略把跨域请求都禁止了,但是页面中的<script><img><iframe>标签是例外,不受同源策略限制。Jsonp就是利用<script>标签跨域特性进行跨域数据访问。

JSONP的理念就是,与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段Javascript,在这段Javascript代码中调用了约定好的回调函数,并且将数据作为参数进行传递。当网页接收到这段Javascript代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了。

JSONP的缺点是:它只支持GET请求,而不支持POST请求等其他类型的HTTP请求。

以上就是有关Cookie和Session常见的面试点,不知道有多少同学可以在面试中准确回答所有问题。

发表评论:

最近发表
网站分类
标签列表