也许这个问题似乎是基于观点的,但是我在决定确保RESTful API安全时遇到了困难。
首先,我的用例:
我的应用程序非常简单:前端是使用React.js(用于浏览器客户端)编写的,它将使用RESTful API从数据库(或其他东西)获取数据。该API使用Spring framework构建。
此API并不是公共API,它只有一个客户端(到目前为止,以后将是移动应用程序)。
现在让我们来解决安全问题。显然,我想保护我的API,我将Spring-security用作此工作的工具。在学习的最初几天,我只了解基本身份验证。但是,当我继续阅读更安全的选项时,我学到了一些新奇的术语:
当我阅读来自Auth0,Okta等更多博客时,我搞砸了一切。这让我三思而后行,是否应该使用OAuth来保护REST API(这不是公共的)。此外,几乎所有有关OAuth的博客都以社交登录为例。这让我更加困惑,因为OAuth是用于将您的API授予第三方应用程序的访问权限。就是这样,不是我的用例。
然后,我从一些渠道和博客中询问了一些专家,有人说基本身份验证足以确保安全性(使用https),因此我应该避免OAuth这么小的要求。其他人则相反,说Basic-Auth具有安全漏洞。
让我们认为OAuth非常适合我,但是在这种情况下,我的授权服务器会放在哪里?因为教程仅通过将授权代码保留在同一层中来解释授权服务器。没有单独的项目或其他东西。
JWT对我的用户案例也有一些负面评价:
我真的需要更多建议,这已经花费了我很多时间。
谢谢。
答案 0 :(得分:1)
真正的答案取决于您问题中所没有的信息。例如,您需要identity verification
还是只是authorizing
API访问权限?
要授权API端点,有许多解决方案。最常见的是secret key value
和JWT。密钥有很多弱点,所以我在这里不再赘述。
授权API端点的一种非常常见的方法是使用JWT令牌和Authorization: Bearer TOKEN
HTTP标头。现在,我将尝试回答您对使用JWT令牌的担忧。这里我仅指Signed-JWT令牌。
它们无法撤消,只会自行失效。是不是 不安全?
可以通过撤销签名证书来撤销JWT令牌。这将需要创建证书吊销服务器,因此并不常见。一种改进的方法是创建short-lived
令牌。典型的到期时间是60分钟(3600秒),但是您可以在任何时间段创建令牌。令牌过期后,客户端会请求一个新令牌,您的后端可以授权或拒绝该令牌。
与会话令牌或cookie相比,它们的体积很大
什么是大块?您可以从几个字节(签名加上数据的大小)创建任意大小的令牌,或者在令牌中包含大量信息。除非您的令牌大小不受控制,否则对于大多数实现而言,这都无关紧要。
验证的计算成本很高
再次使用模糊的术语。除非您使用的是物联网之类的小型设备(已经在使用SSL证书,加密等),或者您需要每分钟处理数百万笔交易,否则验证签名的JWT不会在计算上造成开销。换句话说,除非您有充分的理由担心CPU周期,否则不必担心它们会提高安全性。
让我们认为OAuth非常适合我,但在这种情况下, 我的授权服务器将驻留在哪里?
您的OAuth 2.0授权服务器可以位于您想要的任何位置。实施OAuth非常容易,并且有许多库可以为您管理详细信息。您的授权服务器可以是后端的一部分,也可以是单独的服务器等。您甚至可以将其完全外包给身份提供者,例如Google Login,Auth0,Okta等。