同源策略: http协议 域名 端口一致
跨域请求
Access-Control-Allow-Origin: *
请求分为
- 简单请求,浏览器直接发起请求 fetch。
fetch('https://baidu.com');
需要满足以下几个要求
- 请求方法为: post, get, head
- 头部字段满足CORS安全规范, Fetch Standard
- 请求头的Content-Type为
text/plain
multipart/form-data
application/x-www-form-urlencoded
简单请求跨域的CORS解决办法 - Access-Control-Allow-Origin: [设置为request Origin值]
- Access-Control-Allow-Origin: *
- 非简单请求,浏览器会发起一个预检options方法的请求,检查是否允许来自当前域的请求
预检请求OPTIONS
Origin: http://my.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: a, b, content-type
Access-Control-Allow-Origin: http://my.com
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: a, b, content-type
Access-Control-Max-Age: 86400
通过预检请求后发起简单请求
为什么需要CORS:
- 保护服务器, 有助于减轻服务器负载和风险
- 保护隐私,CORS限制了敏感数据的访问
- 安全考虑,防止盗用用户数据或进行CSRF攻击
如何解决CORS问题
- 配置Nginx代理
- 按照CORS工作机制,正确配置相关表头和正确的处理预检请求
res.header('Access-Control-Allow-Origin', 'https://example.com') //允许特定域名 - JSONP