如何使用CORS保护REST API?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用CORS保护REST API?相关的知识,希望对你有一定的参考价值。

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

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

答案

CORS仅适用于浏览器和htmlcurl不关心它。因此,如果您将服务限制为仅从您的域访问,则其他站点将无法访问它。

为了让他们可以使用您的服务 - 这些网站可以设置nginx或apache来将一些流量转发到您的服务。因此,3D-party站点将访问自己的主机并配置自己的CORS,并且主机将与您的服务进行通信。

另一个(类似的)解决方案是你设置2个主机名(子域?),导致相同的服务。并将一个暴露给您自己的站点(使用严格的CORS),另一个暴露给外部客户端。

另一答案

我想用CORS保护我的前端

CORS不保护前端中的任何内容,CORS是一种防止未经授权的网站进行跨站点脚本编写的方法。 CORS标头仅对浏览器的XHR调用有效。它不会阻止直接加载资源。

如果我将Access-Control-Allow-Origin设置为*,那么所有其他客户端将能够访问API,但我自己的前端将更加暴露。

恕我直言,你的前端将像以前一样可以访问。 CORS标头仅对浏览器的XHR调用有效

另一方面,将其设置为我的域会强制客户端提供(伪)Origin头并有效地禁止使用浏览器作为客户端(通过不同域上的前端)。

并不是的。有几种选择:

  • 您可以为每个API客户端提供允许的主机列表(根据客户端的身份验证设置原始标头有效)这是许多API提供商所做的事情(FB,Google,Amazon,..)
  • 浏览器(在XHR调用中)发送Origin标头,您可以检查并发送或拒绝来自Origin标头的主机名

非浏览器客户端不受CORS标头的限制。

我应该为API使用两个不同的端点,一个用于公共访问,另一个用于我的前端?我很感激一些建议

正如评论中所写 - 假设功能相同且用户经过身份验证,那么恕我直言,没有必要为内部/公共使用提供单独的服务。

这些都是特定问题的答案,但我仍然不相信你想要实现什么/为什么/如何实现。

以上是关于如何使用CORS保护REST API?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护同一服务器上前端使用的 Rest API 端点?

如何发布访问 REST api 的 jQuery 代码,但保护它免受未经授权的使用

Yammer REST API - 如何从不同来源 (CORS) 获取数据?

当我的目标是动态时如何解决 Rest API 的 CORS 错误

调用 REST API、JavaScript 时的 CORS 策略 [重复]

Tomcat REST API 上的 CORS 访问