您的位置 首页 php

Cookie 和 Session的区别,你真的了解吗?

之前面试新人的时候,我经常会提出这样的问题: Cookie session 有什么区别?大部分面试者都会说出一两句,但是真涉及原理时候很多都答不出来,今天我就和大家聊一下这两者的区别。

Cookie是什么?

HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是保存在本地浏览器的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态,当我们关闭浏览器或cookie超过设置的过期时间后,cookie才会被清空。

Cookie 主要作用:

Session是什么

Session 代表着服务器和客户端一次会话的过程,Session 对象存储 在服务器端,用来保存特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页面之间跳转时,存储在 Session 对象中的数据将不会丢失,而是在整个用户会话中一直存在下去,只有当Session清除或超过期的时候, Session才能被清空。

Cookie 和 Session 有什么不同和相同?

不同点:

1、保存的方式不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。

2、存取方式的不同,Cookie 只能保存文字类容,Session可以存任意数据类型,包含文字,二进制数据,对象等等,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。

3、隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些,这里只是相对,实际使用中cookie都是加密保存,使用时候再解密。

4、存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。

相同点:

1、都可以设置过期时间,超过过期时间后都会空清空。

2、都可以用来保存一些状态数据,如用户登录后的用户id。

3、都只对当前会话作用域有效,即A打开网站和B用户打开网站产生的cookie和session都是独立的。

4、都不能跨域:Cookie和Session都不能跨域传递和请求,即不同域名下的cookie或session是不能互相传递的。

为什么需要 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 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

如果你是做过asp.net开发的,你会发现浏览器的cookie中有一个名为ASP.NET_SessionId的cookie存在,如下图:

搞php开发的,浏览器一般会有一个sid的cookie存在,如下图:

但是要注意,浏览器是可以选择将cookie进行禁止的,所以就必须要有其他的机制可以保证cookie禁止的状态下仍然可以发送session id到服务器,经常采用的方式就是URL重写,如

所以Cookie只是Session的一个载体。

如何考虑 分布式 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 的理念请看我的另外一篇教程:

以上就是有关 Cookie 和 Session 常见的知识点,希望对大家有帮助,欢迎大家转发和关注。

文章来源:智云一二三科技

文章标题:Cookie 和 Session的区别,你真的了解吗?

文章地址:https://www.zhihuclub.com/76851.shtml

关于作者: 智云科技

热门文章

网站地图