一. 什么是跨域?

出于安全考虑,浏览器限制页面脚木发起跨域请求,所以XMLHttpRequestfetch API是遵循同源策略的。

例如,在http://domain-a.com 页面用XMLHttpRequest向http://domain-b.com 发起HTTP请求,这就是跨域。

补充:CSS、JS和图片等静态资源是不受同源策略限制的。

二. 为什么要限制跨域?

如果没有跨域限制,很容易发生下面这种情况:

  1. 首先,用户登陆银行网站https://www.bank.com, 返回用户认证信息并存在cookie。

  2. 然后,用户打开恶意网站http://www.hacker.com, 网页向https://www.bank.com 发起http请求。

  3. 最后,银行网站取出cookie, 验证用户身份无误并返回数据,造成了数据泄露。

这是一个典型的CSRF攻击。黑客在恶意网页向第三方网站发送伪造请求,造成数据泄露等危害。

但有些场景是存在跨域的。例如,在前后端分离的网站(前后端域名不同),前端网页怎么跨域请求后端服务呢?

三. 怎么实现跨域访问控制?

为了保证安全地进行跨域资源共享,就有了CORS机制,它允许服务器对跨域请求进行访问控制

首先,把请求分为两类: simple requestpreflight request, 两者区别在于后者对服务器有副作用

simple request:

在XMLHttprequest出现之前,就已经有<form>与服务器进行数据交互。

类似<form>的称为simple request, 必需满足以下两点:

HTTP Method为: GET、 POST、 HEAD。

HTTP Header 为:

  • Accept、 Accept - Language、Content -Language。
  • Content-Type: text/plain、multipart/ form-data、application/x-www-form-ur lencoded。
  • Range:只允许简单的范围值,例如bytes=256-。
  • 没有使用ReadableStream对象。

simple request使用originAccess-Control-Allow-Origin来完成访问控制。

浏览器请求时带上origin (HTTP Header), 表示请求来源。

服务器响应时返回Access-Control-Allow-Origin (HTTP Header), 表示允许访问的源。

浏览器判断请求源origin是否在服务器允许访问的范围内Access-Control-Allow-origin,如果不在范围内,则返回失败。

preflight request :

如果请求对服务器有副作用,浏览器会先用OPTIONS方法发送一个preflight request,检查服务器是否允许跨域请服务器确认允许之后,浏览器才发起实际请求。避免跨域请求对服务器数据造成未预期的影响。

第一次OPTIONS请求:

  • origin: 请求源。

  • Access-Control-Request-Method: 跨域请求的HTTP Method

  • Access-Control-Request-Headers: 跨域请求的HTTP Headers

对应响应:

  • Access-Control-Allow-Origin: 允许跨域的源。

  • Access-Control-Allow-Methods: 允许跨域的HTTP Method。

  • Access-Control-Allow- Headers: 允许跨域的HTTP Headers。

浏览器根据prefight request的请求和响应报文进行判断,如果服务器允许跨域,就发起真实请求,否则返回失败。

总结

一次跨域请求过程一般如下:

浏览器发起请求,origin和host 不同就会触发CORS机制,并自动带上origin。

服务器收到请求,根据实际的跨域访问控制需要,返回允许跨域的源。

浏览器收到响应,判断请求源不在服务器允许的范围内,则返回失败。

对服务器有副作用的跨域请求,浏览器会先发一个预检查请求,检查服务器是否允许跨城。

服务器确认允许之后,浏览器才发起实际请求。避免跨城请求对服务器数据造成未预期的影响。

浏览器跨域访问控制(CORS)相关推荐

  1. Ajax 浏览器跨域访问控制

    2019独角兽企业重金招聘Python工程师标准>>> jsonp+ajax实现浏览器跨域通信的原理解析 php+ajax+P3P实现多域名跨域登录 一.关于跨域需要设置的响应头消息 ...

  2. 浏览器跨域服务器响应了吗,浏览器跨域问题之HTTP跨域响应头 | kTWO-个人博客

    摘要 本篇文章主要讲解HTTP中的几种响应头,解决web开发中常见的浏览器跨域问题CORS,主要包括了四个HTTP响应报文中的四个字段,同时讲解了如何携带cookie进行跨域. 0x01 浏览器跨域 ...

  3. php跨域资源共享,CORS 跨域资源共享

    CORS (Cross-Origin Resource Sharing) 跨域资源共享 为什么需要 CORS 首先,跨域指的是同一个域名下的资源,同时要注意域名与子域名,比如 developers.e ...

  4. 网络-HTTP请求跨域访问控制

    本文根据MDN整理 我不说什么是跨域,网上很多,但是要说一下,跨域访问控制这个概念,是浏览器的行为,不是服务器的行为(虽然不少工作都是后端的工程师去配置),产生跨域访问控制的原因有两个: 1.前端发出 ...

  5. 跨域-(jsonp cors)

    同源策略它是由NetScape提出的一个著名的安全策略. 浏览器执行js,会检查它属于哪个页面,如果不是同源页面,不会被执行. 由于浏览器的同源策略,只要发送请求url与页面地址有不同的即为跨域.只要 ...

  6. Spring全家桶-Spring Security之跨域与CORS与防护

    Spring全家桶-Spring Security之跨域与CORS Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以 ...

  7. 记录 关于浏览器跨域和设置默认浏览器的问题

    @Author:Runsen 当你使用ajax访问本地的json文件的时候,就会报from origin 'null' has been blocked by CORS policy: Cross o ...

  8. 跨域资源共享CORS详解

    最近深入了解了CORS的相关东西,觉得阮一峰老师的文章写得最详细易懂了,所有转载作为学习笔记. 原文地址:跨域资源共享 CORS 详解 CORS是W3C的一个标准,全称是跨域资源共享(Cross-or ...

  9. 浏览器跨域访问解决方案

    浏览器跨域访问解决方案 2015年11月4日 18972次浏览 跨域的概念 跨域大家都知道,不同地址,不同端口,不同级别,不同协议都会构成跨域.例如:about.haorooms.com和www.ha ...

最新文章

  1. 荣耀的鸿蒙系统是什么样的,核心还是备胎?华为鸿蒙系统究竟怎么样了?
  2. [跟我学UML] UML类图中的泛化
  3. bat怎么获取前一天 的日期_bat脚本 得到前一天的日期
  4. mysql 字符编码
  5. 大话ConcurrentHashMap的put,get过程
  6. TCP服务器端和客户端建立连接 - 客户端的回调处理
  7. python蟒蛇代码_011 实例2-Python蟒蛇绘制
  8. c++中射线表示_射线与球的相交测试
  9. 大数据之-Hadoop完全分布式_集群下_单个节点启动_一个一个启动集群节点---大数据之hadoop工作笔记0035
  10. java基础-- 集合框架入门 及 List集合
  11. java azure blobs sas_仅使用SAS令牌连接到Azure存储帐户?
  12. 代管挂账业务,没有做代管挂账确认单是否可以暂估入账
  13. 我的编程之路点滴记录(五)
  14. 使用scrapy框架爬取腾讯招聘信息
  15. Superset可视化之制作地图
  16. 运用gm/id法设计二级运放教程
  17. 英文字符和数字间隔突然变大
  18. 物联网的概念、分层及关键技术
  19. win10怎么移动软件的位置信息服务器,win10系统移动软件到其他盘的操作方法
  20. 网络营销实验一 企业网站专业性诊断评价

热门文章

  1. 关于6G,这些你应该了解
  2. 声控计算机在线使用,「一学就会」电脑也能“声控”开机
  3. DICOMRT-DiTools:clouddicom源码解析(1)
  4. android amr-wb 编解码
  5. 微信小程序 使用Echarts实现省市地图(山东地图demo)
  6. 项目管理到底管的是什么?
  7. vue实现留言板的功能_Vue实现简单的留言板
  8. Excel股票个股分析工具
  9. 戴尔笔记本电脑更换固态重装系统
  10. 计算机二级python模拟软件