文章目录
小编目前只更新了这些,后续还会继续更新的!
一.cookie、session、token、localStorage 、sessionStorage的区别?
一、cookie
- 诞生原因:HTTP请求是无状态协议,一旦数据交换完毕,客户端与服务器之间的连接就会关闭,再次交换数据就会再次建立连接。也就是服务端无法将请求和响应之间的通信状态进行保存,设计之初就为什么不保存呢?是为了便于去处理大量的事务信息。
- 作用:解决如何能在某个域名下的所有网站能够共享某些数据
- 作用流程:
- 当第一次给服务器发请求的时候,服务器接收后就会创建session,并发送一个http响应到客户端,响应头中包含Set-Cookie头部 ,sessionId等,该cookie包含用户信息,客户端存储在本地,用来维护用户计算机中的信息,直到用户删除。
- 当客户端再次访问该服务端时,就会把该cookie一起添加到http请求中,发送到服务器,服务端就能分解 cookie 解析出 sessionId 来在 session 列表中查找出对应的 session ,就可以识别当前用户是否登录。
二、session
- 称为会话信息,session的作用和cookie的基本类似,但是两者的不同在于,cookie存储在客户端,session保存在服务器端,是在服务器端使用的一种记录客户端状态的机制。
- 他会在客户端第一次访问服务端时生成,后面客户端访问时,会携带session_id,服务器就会在自身的储存中查询该用户的状态
- 两者对比好比如一个会议要检查用户是否被邀请,cookie的就是邀请者有邀请函,session就是有举办方有一份名单,名单上有邀请者的名字,就能进入,没有就没有被邀请
cookie只是实现session的其中一种方案,还有很多中方式实现session,同时cookie和session往往是一起出现的,前者在客户端,后者在服务端。一般数据量比较大的时候是存储在服务端的.
三、token
- 诞生原因: 也称作令牌,由uid+time+sign[+固定参数],当我们的客户端频繁的向服务端请求数据的时候,服务端就需要频繁的用密码和账户名去对比,为了避免这个频繁的操作。token就应运而生了,只要在登录了一次后,一般就会存储 token 在客户端的 ==localStorage ==中,每次请求的时候带上即可。
- 组成:
- uid: 用户唯一身份标识
- time: 当前时间的时间戳
- sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
- 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
- 解决问题:
- 减轻服务器的压力,减少频繁的查询数据库。
- 由应用管理,所以它可以避开同源策略
- 可以避免 CSRF 攻击
- 可以是无状态的,可以在多个服务间共享,便于分布式服务
// 通过axios请求拦截器添加token,从而拥有获取数据的权限 config请求头对象
axios.interceptors.request.use(config => {
//通过axios请求拦截器添加token,从而拥有获取数据的权限 config请求头对象
// 为请求头对象,添加token验证的Authorization字段
config.headers.Authorization = window.sessionStorage.getItem('token')
// console.log(config);
// 在最后必须返回 return config
return config
})
// 在response拦截器中,隐藏进度条 NProgress.done()
axios.interceptors.response.use(config => {
NProgress.done()
return config
})
- tokken可以避免CSRF攻击?
- 之所以会被CSRF攻击是因为我们的 cookie 被劫持了,攻击者伪造我们的请求,在我们不知道的情况下,拿到我们的 cookie 去访问服务器。对于服务器来说,因为是携带了 cookie 这个凭证,就会认为是本人在进行操作。
- 同时 POST 请求并不受到浏览器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域发送 POST请求,根据上面的条件就形成 CSRF 攻击了。
- 但token不同,token是开发者为了防范csrf而特别设计的令牌,浏览器不会自动添加到headers里,攻击者也无法访问用户的token,所以提交的表单无法通过服务器过滤,也就无法形成攻击。
四、localStorage
- 出现的原因:虽然本地的存储已经有cookie,因为需要发送到服务端,所以cookie的存储很小,4K左右,因为大了会影响每次访问携带的,而大多数浏览器支持2M以上,我们就可以使用localStorage来存储而且是绑定到同源的(域/协议/端口三者),非同源的无法访问到
- 特点:
- 在同源的所有标签页和窗口之间共享数据
- 生命周期为永久生效,除非手动删除,不然关闭页面也会存在
- 可以多个窗口共享(同一浏览器可以共享)
- 以键值对的形式存储使用
- localsStorage.setItem(key,value)
- localStorage.getItem(key)
- localStorage.removeItem(key)
- localStorage.clear()
五、sessionStorage
- sessionStorage 和localStorage大体上是相近的,但有更多的限制条件
- 生命周期为关闭浏览器,数据在页面刷新后仍然保留,但在关闭/重新打开浏览器标签页后不会被保留
- 同一个窗口下的数据可以共享,且在同一标签页下的 iframe 之间是共享的(假如它们来自相同的源)
- 以键值对的形式存储使用
- sessionStorage.setItem(key,value)
- sessionStorage.getItem(key)
- sessionStorage.removeItem(key)
cookie与sessionStorage,localStorage的区别有:
- 共同点:都是保存在浏览器端、且同源的
- 区别:
1、cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递,而sessionStorage和localStorage不会自动把数据发送给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下
2、存储大小限制也不同,cookie数据不能超过4K,同时因为每次http请求都会携带cookie、所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
3、数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭之前有效;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie:只在设置的cookie过期时间之前有效,即使窗口关闭或浏览器关闭
4、作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localstorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的
5、web Storage支持事件通知机制,可以将数据更新的通知发送给监听者
6、web Storage的api接口使用更方便
二、 DNS(domain name system)
定义
- 域名系统的缩写,由解析器和域名服务器组成,又称域名解析服务器,就是把机名系统转换为IP地址的系统,靠它将需要访问的网址在域名服务器中找到,然后把信息传输到电脑上
解析过程 - 某个应用进程要将主机名解析为ip地址,就会调用解析程序,并成为DNS的一个用户
- 把待解析的域名放到DNS请求报文中,以UDP用户数据报方式发送给本地域名,如果在本地域名能找到,
域名查询
三、OSI模型中的传输层。传输层提供两种服务
- 面向连接的可靠的服务(TCP)
- 无连接的不可靠的服务(UDP)
相同点
- 都是用来在程序之间传输数据的协议
- 传输的数据最终都是二进制
不同点
- UDP不需要建立连接
- UDP性能损耗少,内存中的占用资源也少
- UDP传播速度快,但是稳定性弱
- TCP通过三次握手和四次挥手建立连接彼此之间有状态,从而保证建立起可靠的传输
四、传输层控制协议(TCP)和用户数据报协议(UDP)
概念:
- UDP是网络传输层协议,提供无连接(彼此之间无状态的连接),不可靠的数据报尽力传输服务,只提供了传输层需要实现的最低限度的功能,除了差错检验外,几乎没有对IP增加其他的东西。
数据报结构:
- 源端口号:发送方的应用程序端口号(16位)
- 目的端口号:接收方的应用程序的传输层端口号(16位)
- 长度字段:UDP报文段中的字节数(首部和数据的总和)
- 校验和:接收方检测报文字段是否正确传输,但是对于差错的恢复是无能为力的(采用的是校验码)
- 应用数据
五、为什么要UDP ?
- UDP有单播,多播,广播的功能
- UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式.
UDP使用场景
- 发送数据包简单的将数据包封装一下速度快,但是可能产生丢包,使用于实时性较高的场景
- 域名查询
- 视频直播
- 语音通话
六、传输层控制协议(TCP)
概念:TCP的全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 是面向连接的、可靠的流协议(流就是指不间断的数据结构)。TCP连接是全双工的不分客户端和服务端
1.为什么要TCP ?
- 为了在不可靠的信道上建立可靠的连接
2.TCP如何保证可靠丢包问题,和发送包的内容的乱序问题?
- 三次握手和四次挥手
3.TCP的使用场景?
- TCP传输数据稳定可靠,适用于网络质量要求较高的场景,需要准确无误的传输给对方
- 传输文件
- 浏览网页
4.三次握手?
5.四次挥手?
七、 输入url后发生了什么?
详情:
1.浏览器(客户端)进行地址解析,补全域名
浏览器会对一些默认的东西进行补齐。例如:互联网url默认端口号为80,浏览器默认补齐功能会补齐协议http,有些还会直接在域名前面补上www。
2.,DNS域名解析
- 先查看浏览器dns缓存中是否有域名对应的ip。
- 如果没有,则查看操作系统dns缓存中是否有对应的ip(例如windows的hosts文件)。
- 依旧没有就对本地区的dns服务器发起请求,
- 如果还是没有,就直接到Root Server域名服务器请求解析。
<1>、DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议
<2>、全球只有十三台逻辑根服务器
3.通过ip寻址和arp,找到目标(服务器)地址
4.三次握手建立TCP连接;
5.发送HTTP请求;等待响应
浏览器会对请求进行包装,包装成请求报文。
6.服务器处理请求,返回响应结果
浏览器请求报文到达服务器之后,服务器接口会对请求报文进行处理,执行接口对应的代码,处理完成后响应客户端。
7.关闭TCP连接
8.浏览器解析HTML
浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。渲染树与DOM树不同,渲染树中并没有head、display为none等不必显示的节点。
9.浏览器布局渲染
浏览器采用至上而下的方式解析
html解析->外部样式、脚本加载->外部样式执行->外部脚本执行->html继续解析->dom树构建完成->加载图片->页面加载完成
八、HTTP2.0和HTTP1.0的区别
多路复用:同一个连接并发处理多个请求,同时数量也较多
二进制分帧:分割为更小的消息和帧,采用二进制格式编码
首部压缩:使用HPACK算法对header数据进行压缩,体积更小,速度更快
服务器推送:服务端推送是一种在客户端请求之前发送数据的机制,HTTP2.0引入了server push,它允许服务端推送资源给浏览器
内容安全(基于HTTPS)
九、http中hash和history的区别?
Hash :地址栏URL中的#符号 #/index window.location.hash
History:在host之后直接添加斜线和路径请求 /index,window.location.pathname
区别
是否向后端传参 :Hash的#后面的内容不会包含在请求中,只是被前端浏览器利用刷新网页;History是看到请求的url为完整的url,请求后端
是否刷新页面:Hash不刷新;History刷新
方法:Hash:onhashchange History:pushState replaceState