限制网页加载跨域资源
同源判定: 同全部域名 + 同协议 + 同端口
静态资源服务器地址 由Webpack配置
数据服务器地址 由Axios配置
如果是CDN, 两者都需要服务器配置CORS
非同源简单请求: 会发出 实际请求, 会有服务器响应,但浏览器会阻止JS访问响应
非同源非简单请求: 会发出 预检请求, 服务器响应 CORS preflight failed, 无实际请求
Access-Control-Allow-Origin: *信任源
Access-Control-Allow-Credentials: true是否可携带凭证
主要场景是要求携带cookie, 其他凭证(HTTP Auth、客户端证书)也适用
Allow-Credentials: true不能与Allow-Origin:*连用,必须指定Origin
允许携带cookie后,还必须满足SameSite,才能带上cookie
Access-Control-Max-Age: 3600预检请求(OPTIONS)的缓存时间 单位秒
Access-Control-Allow-Methods:GET,POST请求方法是否允许
Access-Control-Allow-Headers:Content-Type请求头是否允许
credentials 或 withCredentials
跨域请求分为两类 简单请求 预检请求
请求方法: GET HEAD POST
请求头: 不能含任何自定义请求头, 且Content-Type:
text/plain, multipart/form-data,
application/x-www-form-urlencoded
body: 内属性不影响
第三方库可能会修改请求头, 导致看上去简单请求, 实际上不简单
axios.post('xxx', {a:1})会修改Content-Type: application/json
POST + application/json
携带自定义请求偷
服务器检查 Origin Method Headers,如果通过:
服务器响应预检请求,带上各种跨域配置
预检请求 不会带 cookie!!!
Allow-Origin Allow-Credentials 这两个响应头必须携带
简单请求/预检请求(allow) + SameSite + 前端credentials include
1.服务器允许: 简单请求 或 预检请求里携带
Access-Control-Allow-Credentials: true
2.cookie允许: 需要在登录时 cookie配置了
Set-Cookie: sessionId=xxxx; HttpOnly; Secure; SameSite=None
3.前端配置: 前端设置了
credentials:'include' 或 Axios withCredentials:true
Credentials: true 意味着可以携带cookie
Origin: * 意味着信任任何源
任何网站可以向服务器请求并携带用户cookie
意味着允许任何网站发起 CSRF(跨站请求伪造)攻击
如果想允许多个origin,
返回响应头前 代码判断 当前origin 是否白名单内, 在白名单内再将其配进响应头
Allow-Origin: https://*.example.com也不行, 浏览器不支持通配符