我正在开发一个Web应用程序,通过REST API可以访问前端和各种客户端(curl
& co。)的数据。前端和后端都将位于同一个域中。我想用CORS保护我的前端,这对我来说是一个两难选择。如果我将Access-Control-Allow-Origin
设置为*
,那么所有其他客户端将能够访问API,但我自己的前端将更加暴露。另一方面,将其设置为我的域会强制客户端提供(假的)Origin
标头,并有效地禁止使用浏览器作为客户端(通过不同域上的前端)。
这通常如何解决?我应该为API使用两个不同的端点,一个用于公共访问,另一个用于我的前端?我很感激一些建议。
答案 0 :(得分:2)
我想用CORS保护我的前端
CORS不保护前端中的任何内容,CORS是一种防止未经授权的网站进行跨站点脚本编写的方法。 CORS标头仅对浏览器的XHR调用有效。它不会阻止直接加载资源。
如果我将Access-Control-Allow-Origin设置为*,那么所有其他客户端将能够访问API,但我自己的前端将更加暴露。
恕我直言,你的前端将像以前一样可以访问。 CORS标头仅对浏览器的XHR呼叫有效
另一方面,将其设置为我的域会强制客户端提供(伪造)Origin标头并有效地禁止使用浏览器作为客户端(通过不同域上的前端)。
不是真的。 有几种选择:
您可以拥有每个API客户端允许的主机列表(根据客户端的身份验证设置原始标头有效)这是许多API提供商所做的事情(FB,Google,亚马逊, ..)
浏览器(在XHR调用中)发送Origin
标头,您可以检查并发送或拒绝来自Origin标头的主机名
非浏览器客户端不受CORS标头的限制。
我应该为API使用两个不同的端点,一个用于公共访问,另一个用于我的前端?我很感激一些建议
正如评论中所写 - 假设功能相同且用户已通过身份验证,那么恕我直言,没有必要为内部/公共使用提供单独的服务。
这些都是特定问题的答案,但我仍然不相信你想要实现的是什么/为什么/如何实现。
答案 1 :(得分:1)
CORS仅适用于浏览器& HTML。 curl
并不关心它。因此,如果您将服务限制为仅从您的域访问,则其他网站将无法访问它。
为了让他们可以使用您的服务 - 这些网站可以设置nginx或apache来将部分流量转发给您的服务。因此,3D-party网站将访问自己的主机,并配置自己的CORS,主机将与您的服务进行通信。
另一个(类似的)解决方案是为您设置2个主机名(子域?),从而实现相同的服务。并将一个暴露给您自己的站点(使用严格的CORS),另一个暴露给外部客户端。