记得我第一次正式的串接API的时候,踏着愉悦的心想说自己要成为一个真正的前端要来串接了~~~ 结果写了对应的程序打API之後,资料没有出来,还马上在console里收到一个红红的错
这个问题通常因为放到正式环境又没问题了,或者直接拍出大绝请後端开好开满,把 Access-Control-Allow-Origin: *
设定完成,几乎就解决问题了~
没错,如果你只想30秒解决这个问题,告诉你一个快速的结论:
请後端工程师,在API的header加上这个设定属性Access-Control-Allow-Origin: *
但只要这样就够了吗?身为一个追根究底的工程师,我们应该知道为什麽会有这个问题吧!或是如果在本机开发遇到这个状况该怎麽处理?或是知道之後才方便之後被面试问到的时候不会答不出来吧(?)
好啦,有这麽多理由该知道,那我们就开始吧!
其实错误讯息里就告诉你为什麽了
access to XMLHttpRequest at 连结A from origin 连结B has been blocked by CORS policy: response to preflight request doesn't pass access control check: No 'Access-control-allow-origin' header is present on the requested resource
当你要从连结B要request到连结A时,被CORS的政策挡下来了,冒号後面告诉你原因:因为preflight request没有通过存取检测,请检查看看request的来源的header有没有access-control-allow-origin。
实务上就是我的前台网站在 连结A 但需要透过API 连结B 时,前後台两者网址不同来源,但前台要取得不同来源的资料时,若没有做好相关的设定就会出现上面的错误
错误讯息好像每个字都看得懂,但CORS是什麽意思?又为什麽要有CORS? header要加的这个又是什麽呢?接下来让我们继续看下去~
在开始CORS之前,我们需要先知道浏览器的Same Origin Policy(同源政策)。
浏览器基於安全性的考量,规定当你的网站要呼叫API时,需要是同一个来源。
如果是不同来源,浏览器依然会帮你发出request,但会把收到的response阻挡起来不给你的网站。
那什麽叫同一个来源呢?
当两个网址的 schema(protocol) + host + port 皆相同,就是同源(Same-Origin),只要有一者不同,就是跨来源(Cross-origin)
以下举几个范例:
来源1 | 来源2 | 结论 |
---|---|---|
http://www.abc.com.tw | https://www.abc.com.tw | 跨来源,schema不同 |
http://www.abc.com.tw | http://www.api.abc.com.tw | 跨来源,host不相同 |
http://www.abc.com.tw:8080 | http://www.abc.com.tw:4200 | 跨来源,port不相同 |
http://www.abc.com.tw/web:8080 | http://www.abc.com.tw/api:8080 | 同源 |
了解了同源、跨来源後,你应该接下来马上会想到... 怎麽可能我要打的API都是同一个来源呢?如果就是不同源该则麽办?
CORS = 跨来源资源共用(Cross-Origin Resource Sharing (CORS))。
跨来源资源共用 : 发出request的来源不同,但需要共用资源
可以把API request想像成大楼里的一个个部门办公室,有各自的门禁卡。资讯部的人不能进到行销部,因为他们是不同来源。那如果最近资讯部跟行销部密切合作,希望可以让资讯部的人直接进到行销部怎麽办?这时候浏览器就是这个开启门禁卡权限的管理员,要开启门禁权限的方法就是CORS
简单来说,要开启不同来共享资源的方式就是:透过在API的response中加入新的http header让浏览器透过这些资讯,来决定要不要放行这个response。
我们已经简单的知道为什麽我们会遇到这个问题了,那要怎麽加上新的http header当作跨来源的通行证? 又详细的运作原理是什麽呢?待明天揭晓~
<<: Day 7 Swift语法-基础篇(5/5)-Structures and Classes
>>: Day 4. Compare × Generations
让无生命的东西得到认知能力,仔细一看发现这节在讲 AI 的趋势...............深蓝和华...
跨站脚本攻击(XSS) 攻击 XXS就是透过网页没有适当筛选、处理文字造成的漏洞 例如有用户将<...
崩溃的起因 - 开发时期,我在网页内放置了一段 CSS Animation的动画,这个功能在电脑上执...
今日题目 题目连结:653. Two Sum IV - Input is a BST 题目主题:Ha...
Cookie HTTP cookie 简称为Cookie,当使用者浏览网页时,web server会...