同源策略的分類: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「積跬步、行千里」—— 持續更新中~,喜歡的話留下個贊和關注哦!