代码改变世界

cookie和session的区别和联系

2021-05-29 15:59  小白的菜园子  阅读(3627)  评论(0编辑  收藏  举报

一:什么是Cookie和Session?

Cookie是服务器发送到客户浏览器,并保存在本地的数据,它会在浏览器下次访问服务器时,被一块带过去;通常会用来告知服务器该请求是否来自同一个浏览器,记录用户是否登录;

Session是一个会话级别的数据存储,数据保存在服务器端,在整个会话过程中,保存在session中的数据都会存在;当服务器与浏览器的会话结束或者浏览器关闭时,数据就会失效;

二:Cookie和Session的区别?

存储位置不同:cookie保存在客户端浏览器,session保存在服务器端;

存取方式不同:cookie只能保存ASCII(是基于拉丁字母的一套电脑编码系统),session能保存任意数据类型;

有效期不同:cookie中的数据可以长时间存在,session中的数据在会话结束或者浏览器关闭时失效;

数据安全性不同:因为cookie是保存在浏览器中的,数据安全性相对较差;session是存储在服务器端的,安全性相对较高;

存储大小不同:cookie一般保存的数据大小不会超过4K;而session理论上来说没有限制;

三:为什么需要Cookie和Session,它们的联系是什么?

因为浏览器是无状态的(http协议是无状态),浏览器并不知道是谁在跟服务器联系,这个时候就需要一个机制来告诉服务器,是谁在操作浏览器,操作人是否登录等,要实现这个机制,就需要cookie和session配合完成;

当用户第一次访问服务器时,服务器会根据用户提交的信息生成session,然后给浏览器返回一个sessionId,浏览器接收到这个sessionId后,保存在cookie中,同时cookie记录此sessionId属于哪个域名;

用户再次访问服务器时,请求会自动判断此域名下是否用cookie信息,如果存在cookie,则将cookie发送给服务器,服务器解析cookie拿到sessionId,然后根据sessionId查询session信息,如果能找到session信息,则可以执行后面的操作,如果没有则说明没有登录或者登录已经失效;

sessionId是联系cookie和session的桥梁,大部分系统也是通过这个来判断用户是否登录;

四:如果浏览器禁止使用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 请求。

(此文章仅用来自己学习使用,源文来源:https://www.cnblogs.com/ityouknow/p/10856177.html)