浏览器
2020-06-05 14:16:42 2 举报
AI智能生成
前端面试 浏览器 网络
作者其他创作
大纲/内容
cookie
.Cookie的来源
<font color="#c41230">Cookie 的本职工作并非本地存储,而是“维持状态”</font>。<br>因为HTTP协议是无状态的,HTTP协议自身不对请求和响应之间的通信状态进行保存
在 Web 开发的早期,人们亟需解决的一个问题就是状态管理的问题:HTTP 协议是一个无状态协议,服务器接收客户端的请求,返回一个响应,故事到此就结束了,服务器并没有记录下关于客户端的任何信息。那么下次请求的时候,如何让服务器知道“我是我”呢?<br><br>在这样的背景下,Cookie 应运而生。<br><br>Cookie 说白了就是一个存储在浏览器里的一个小小的文本文件,它附着在 HTTP 请求上,在浏览器和服务器之间“飞来飞去”。它可以携带用户信息,当服务器检查 Cookie 的时候,便可以获取到客户端的状态。
什么是Cookie
Cookie指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。<br> cookie是服务端生成,客户端进行维护和存储
应用场景
<ul><li>记住密码,下次自动登录</li></ul><ul><li>购物车功能</li></ul><ul><li>记录用户浏览数据,进行商品(广告)推荐</li></ul>
原理
当用户第一次访问并登陆一个网站的时候,<br>cookie的设置以及发送会经历以下4个步骤
1、客户端发送一个请求到服务器<br>2、服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 <br>3、客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部<br>4、服务器返回响应数据<br>
图示
生成方式
生成方式一:http response header中的set-cookie
生成方式二:js中可以通过document.cookie可以读写cookie,以键值对的形式展示
缺陷
Cookie 不够大
当 Cookie 超过 4KB 时,它将面临被裁切的命运
很多浏览器对一个站点的cookie个数也是有限制的
注意
各浏览器的cookie每一个name=value的value值大概在4k,<br>所以4k并不是一个域名下所有的cookie共享的,而是一个name的大小
过多的 Cookie 会带来巨大的性能浪费
<font color="#c41230">Cookie 是紧跟域名的。同一个域名下的所有请求,都会携带 Cookie</font>。大家试想,如果我们此刻仅仅是请求一张图片或者一个 CSS 文件,我们也要携带一个 Cookie 跑来跑去(关键是 Cookie 里存储的信息并不需要),这是一件多么劳民伤财的事情。Cookie 虽然小,请求却可以有很多,随着请求的叠加,这样的不必要的 Cookie 带来的开销将是无法想象的。<br><br>cookie是用来维护用户信息的,而域名(domain)下所有请求都会携带cookie,但对于静态文件的请求,携带cookie信息根本没有用,此时可以通过cdn(存储静态文件的)的域名和主站的域名分开来解决
由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS
安全
<br>
HttpOnly
HttpOnly 不支持读写,浏览器不允许脚本操作document.cookie去更改cookie,<br>所以为避免跨域脚本 (XSS) 攻击,通过JavaScript的 Document.cookie API无法访问带有 HttpOnly 标记的Cookie,它们只应该发送给服务端。如果包含服务端 Session 信息的 Cookie 不想被客户端 JavaScript 脚本调用,那么就应该为其设置 HttpOnly 标记。<br><br>Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
Secure
标记为 Secure 的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。<br>但即便设置了 Secure 标记,敏感信息也不应该通过Cookie传输,因为Cookie有其固有的不安全性,Secure 标记也无法提供确实的安全保障。
存储
存储方式总结
sessionStorage 、localStorage 和 cookie 之间的区别<br>
共同点:都是保存在浏览器端,且都遵循同源策略。<br>不同点:在于生命周期与作用域的不同
缓存
协商缓存 强缓存
HTTP缓存图示
cache-control
跨域
什么是跨域
广义
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源
狭义
由浏览器同源策略限制的一类请求场景
同源策略
"协议+域名+端口"三者相同
有什么用?
它是浏览器最核心也最基本的安全功能,<br>如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击
解决方案
1. 通过jsonp跨域<br>2. document.domain + iframe跨域<br>3. location.hash + iframe<br>4. window.name + iframe跨域<br>5. postMessage + iframe<br>6. 跨域资源共享(CORS)<br>7. nginx代理跨域<br>8. nodejs中间件代理跨域<br>9. WebSocket协议跨域<br>
常用解决方案
jsonp
原理
利用script标签不受跨域限制,向跨域服务接口发送一个带参数的请求;<br>参数中包括跨域回调函数的名称,服务端返回改函数执行的代码并将请求数据作为参数返回
缺点
1、它<font color="#c41230">只支持GET请求而不支持POST</font>等其它类型的HTTP请求<br><br>2、它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。<br><br>3、 jsonp在调用失败的时候不会返回各种HTTP状态码。<br><br>4、缺点是安全性。万一假如提供jsonp的服务存在页面注入漏洞,即它返回的javascript的内容被人控制的。<br>那么结果是什么?所有调用这个 jsonp的网站都会存在漏洞。
CORS
CORS需要浏览器和服务器同时支持
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。<br>对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。<br>浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。<br>因此,实现CORS通信的关键是服务器。
服务器响应头配置
● <font color="#c41230">Access-Control-Allow-Origin</font>: 'http://a.guazi.com:4000' // 允许请求域<br>● Access-Control-Allow-Headers: 'name,Content-Type' // 允许携带请求头<br>● <font color="#c41230">Access-Control-Allow-Methods</font>: 'GET,POST,PUT,DELETE,OPTIONS,HEAD' // 允许请求方法<br>● <font color="#c41230">Access-Control-Allow-Credentials</font>: true // 允许携带cookie<br>● Access-Control-Expose-Headers: 'name' // 允许设置的响应头<br>● Access-Control-Max-Age: '10' // OPTIONS预校验请求时效 单位:秒
普通跨域请求
服务端设置Access-Control-Allow-Origin即可,前端无须设置,<br>若要带cookie请求:前后端都需要设置
常用头
通用头
请求头
响应头
实体头
状态码
状态码分类
常用状态码
请求方法
表格
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。<br>HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
两种请求
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
分类
简单请求
需要满足两大条件
请求方法是以下三种方法之一
HEAD<br>GET<br>POST
HTTP的头信息不超出以下几种字段
Accept<br>Accept-Language<br>Content-Language<br>Last-Event-ID<br>Content-Type:只限于三个值application/x-www-form-urlencoded、<br> multipart/form-data、text/plain
复杂请求
凡是不同时满足上面两个条件,就属于非简单请求
get与post请求的区别
使用区别
<ol><li>GET请求参数放在URL上,POST请求参数放在请求体里</li><li>GET请求参数长度有限制,POST请求参数长度可以非常大</li><li>POST请求相较于GET请求安全一点点,因为GET请求的参数在URL上,且有历史记录</li><li>GET请求能缓存,POST不能</li></ol>
本质区别
5. GET和POST<font color="#c41230">最大的区别主要是GET请求是幂等性的,POST请求不是</font>。<br>
由于GET请求是幂等的,在网络不好的环境中,GET请求可能会重复尝试,造成重复操作数据的风险,<br>因此,GET请求用于无副作用的操作(如搜索),新增/删除等操作适合用POST
http https
0 条评论
下一页