同源策略的分类:node
DOM
进行操做;如不一样域名的 iframe 是限制互相访问。不受同源策略限制:ios
<script src="..."></script>,<img>,<link>,<iframe>
等xss
的研究了,由于你的网站将不是你的网站,而是你们的,谁均可以写个代码操做你的网站界面若是没有XMLHttpRequest 同源策略,那么就能够很轻易的进行CSRF(跨站请求伪造)攻击:mongodb
a.com
,cookie中添加了用户标识。b.com
,执行了页面中的恶意 AJAX 请求代码。b.com
向 a.com
发起 AJAX HTTP 请求,请求会默认把 a.com
对应cookie
也同时发送过去。a.com
从发送的 cookie 中提取用户标识,验证用户无误,response 中返回请求数据;数据就泄露了。并且因为Ajax在后台执行,这一过程用户是没法感知的。JSONP 跨域:借鉴于 script 标签不受浏览器同源策略的影响,容许跨域引用资源;所以能够经过动态建立 script 标签,而后利用 src 属性进行跨域;axios
Access-Control-Allow-Origin:*|[或具体的域名]
就行了;app.use(async(ctx,next) => { ctx.set({ "Access-Control-Allow-Origin": "http://localhost:8088" })
OPTIONS
请求:浏览器发送跨域请求判断方式:segmentfault
请求方法是以下之一:后端
全部的Header都只包含以下列表中(没有自定义header):跨域
Origin:请求的源域信息 Access-Control-Request-Method:接下来的请求类型,如POST、GET等 Access-Control-Request-Headers:接下来的请求中包含的用户显式设置的Header列表
Access-Control-Allow-Origin:容许跨域的Origin列表 Access-Control-Allow-Methods:容许跨域的方法列表 Access-Control-Allow-Headers:容许跨域的Header列表,防止遗漏Header,所以建议没有特殊需求的状况下设置为* Access-Control-Expose-Headers:容许暴露给JavaScript代码的Header列表 Access-Control-Max-Age:最大的浏览器预检请求缓存时间,单位为s
const cors = (origin) => { return async (ctx, next) => { ctx.set({ "Access-Control-Allow-Origin": origin, //容许的源 }) // 预检请求 if (ctx.request.method == "OPTIONS") { ctx.set({ 'Access-Control-Allow-Methods': 'OPTIONS,HEAD,DELETE,GET,PUT,POST', //支持跨域的方法 'Access-Control-Allow-Headers': '*', //容许的头 'Access-Control-Max-Age':10000, // 预检请求缓存时间 // 若是服务器设置Access-Control-Allow-Credentials为true,那么就不能再设置Access-Control-Allow-Origin为*,必须用具体的域名 'Access-Control-Allow-Credentials':true // 跨域请求携带身份信息(Credential,例如Cookie或者HTTP认证信息) }); ctx.send(null, '预检请求') } else { // 真实请求 await next() } } } export default cors
cookie:浏览器
问题:缓存
set-cookie
可是,浏览器cookie并无相应的cookie)决解:安全
axios.defaults.withCredentials = true
Access-Control-Allow-Credentials=true
容许跨域请求携带 Cookie“积跬步、行千里”—— 持续更新中~,喜欢的话留下个赞和关注哦!