如何使用CORS保护REST API?

时间:2017-12-21 20:05:39

标签: rest cors

我正在开发一个Web应用程序,通过REST API可以访问前端和各种客户端(curl& co。)的数据。前端和后端都将位于同一个域中。我想用CORS保护我的前端,这对我来说是一个两难选择。如果我将Access-Control-Allow-Origin设置为*,那么所有其他客户端将能够访问API,但我自己的前端将更加暴露。另一方面,将其设置为我的域会强制客户端提供(假的)Origin标头,并有效地禁止使用浏览器作为客户端(通过不同域上的前端)。

这通常如何解决?我应该为API使用两个不同的端点,一个用于公共访问,另一个用于我的前端?我很感激一些建议。

2 个答案:

答案 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),另一个暴露给外部客户端。