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

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

 第一层楼 

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

什么是 Cookie

HTTP Cookie(也叫 Web Cookie或浏览器 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 ,请求返回时将此 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 一般会有以下几种解决方案:

  • Nginx ip_hash 策略,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象。

  • Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。

  • 共享 Session,服务端无状态话,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。

建议采用第三种方案。

第六层楼

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

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

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

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

  • 通过 Jsonp 跨域

  • 其它跨域解决方案

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

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

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

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

关注下方二维码,订阅更多精彩内容。

转发朋友圈,是对我最大的支持。

面试题:彻底搞懂 Cookie 和 Session相关推荐

  1. postman怎么传session_Day 47: 不搞懂Cookie和session誓不罢休

    Hello大家好!我是Cathy海希,今天是我学习编程的第47天. 欢迎同时关注我的Youtube&B站?Cathy海希TV 今天后知后觉地发现方方老师有在知乎上提及跟我相关的内容,简直太荣幸 ...

  2. 第八十五期:一文彻底搞懂cookie和session

    在Web发展史中,我们知道浏览器与服务器间采用的是 http协议,而这种协议是无状态的,所以这就导致了服务器无法知道是谁在浏览网页,所以为了解决这一问题,先后出现了四种技术,分别是隐藏表单域,URL重 ...

  3. 一文彻底搞懂Cookie、Session、Token到底是什么

    作者:不学无数的程序员 原文链接:https://juejin.im/post/5de4c3c76fb9a071b86cc482 Cookie 夏洛:大爷,楼上322住的是马冬梅家吧? 大爷:马都什么 ...

  4. 彻底搞懂Cookie、Session、JWT和Token

    文章目录 引入:http是一个无状态协议?怎么解决呢? 一.Cookie和Session 1.1 cookie 注意事项: 1.2 cookie 重要的属性 1.3 session 注意事项: 1.4 ...

  5. cookie代码加时间多久出现一次_一文彻底搞懂Cookie、Session、Token到底是什么

    前言 在了解这三个概念之前我们先要了解HTTP是无状态的Web服务器,什么是无状态呢?就像上面夏洛特烦恼中经典的一幕对话一样,一次对话完成后下一次对话完全不知道上一次对话发生了什么.如果在Web服务器 ...

  6. 访问网址 token的格式_一文彻底搞懂Cookie、Session、Token到底是什么

    欢迎关注文章系列 ,关注我 <提升能力,涨薪可待> <面试知识,工作可待> <实战演练,拒绝996> 如果此文对你有帮助.喜欢的话,那就点个赞呗,点个关注呗! Co ...

  7. 一文搞懂cookie与session

    在学习cookie/session 之前需要懂得几个知识. 客户端 客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序.别 称 :用户端 web客户端 :Web客户端主要 ...

  8. 一文搞懂cookie、session、token、jwt、OAuth

    文章目录 0 测试环境 1 cookie 1.1 概念 1.2 使用flask设置cookie 1.3 浏览器端访问 1.4 设置简单cookie 1.5 给cookie设置一些属性 1.6 浏览器操 ...

  9. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

最新文章

  1. cassandra mongodb选择——cassandra:分布式扩展好,写性能强,以及可以预料的查询;mongodb:非事务,支持复杂查询,但是不适合报表...
  2. 将在2021年改变商业格局的10项技术
  3. CVPR 2020 Oral | 无域标签下高清场景时移变换
  4. rabbitMQ 实战 高效部署分布式消息队列 读书笔记
  5. 无心剑随感《最完美的图形——圆》
  6. 一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方
  7. Unity的状态机设计
  8. 中文免费电子书网站合集收藏
  9. K-均值聚类算法通俗讲解
  10. c语言小球碰壁,小球碰壁效果
  11. 新手必备!最全电路基础知识讲解
  12. 数据库课程设计基本框架(PHP+MySQL)
  13. 是你需要的前端编码风格吗?
  14. 红米开发版刷机教程_红米Note3开发版怎么刷机 红米Note3开发版刷机教程
  15. Java Version Mismatch
  16. extjs调试错误 TypeError:p is null 或 TypeError: el is null
  17. python 打印机控制_python调用打印机
  18. Unity游戏开发——向量运算(点乘和叉乘)
  19. 公司内部计算机网络培训,企业内部培训常用的方法
  20. CV算法工程师面试问题集锦,从基础到进阶,会介绍细节,持续更新中......

热门文章

  1. 深入理解Qt的.pro文件
  2. 6、EIGRP配置实验之负载均衡
  3. JVM(三)——对象的访问定位
  4. V 8 nfs+drbd+heartbeat
  5. 原生 js前端路由系统实现3之代码 构建工具 和 querystring功能
  6. 常见的排序算法二——希尔排序
  7. Javascript 仿Flash 图片切换 及 Flash 图片切换
  8. html 表单控制器,c# – html表单发布到mvc控制器
  9. 新年快乐轮播特效html,基于owl-carousel的卡片水平轮播展示特效
  10. python for循环n次_Python入门10 —— for循环