如何使用CORS保护REST API?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用CORS保护REST API?相关的知识,希望对你有一定的参考价值。
我正在开发一个Web应用程序,通过REST API可以访问前端和各种客户端(curl
&co。)的数据。前端和后端都将位于同一个域中。我想用CORS保护我的前端,这对我来说是一个两难选择。如果我将Access-Control-Allow-Origin
设置为*
,那么所有其他客户端将能够访问API,但我自己的前端将更加暴露。另一方面,将其设置为我的域强制客户端提供(假的)Origin
标头并有效地禁止使用浏览器作为客户端(通过不同域上的前端)。
这通常如何解决?我应该为API使用两个不同的端点,一个用于公共访问,另一个用于我的前端?我很感激一些建议。
CORS仅适用于浏览器和html。 curl
不关心它。因此,如果您将服务限制为仅从您的域访问,则其他站点将无法访问它。
为了让他们可以使用您的服务 - 这些网站可以设置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 的 jQuery 代码,但保护它免受未经授权的使用
Yammer REST API - 如何从不同来源 (CORS) 获取数据?
当我的目标是动态时如何解决 Rest API 的 CORS 错误