保护 REST API 的最佳方式是啥? [关闭]

Posted

技术标签:

【中文标题】保护 REST API 的最佳方式是啥? [关闭]【英文标题】:What is the best way of securing a REST API? [closed]保护 REST API 的最佳方式是什么? [关闭] 【发布时间】:2017-07-30 10:15:44 【问题描述】:

我正在使用 Jersey 使用 Java 开发 REST API,保护它的最佳方法是什么?我从基于密码的身份验证中查看了各种内容,Servlet Context,我听说过令牌化等。但是什么是行业标准的方法来保护它并确保没有人可以通过在浏览器中键入 URL 来从 GET 请求中获取数据,只需从 PostMan 进行 POST 调用等等?任何有关实施这种最佳方式的学习材料?

用简单的英语,我要问的是,如何通过确保 API 仅对我们的应用程序可访问来保护我的 REST API?这样做的方法可以是从密码到令牌的任何东西。我现在正在学习它,试图实现它,但在我需要知道要学习什么之前,因为我正在寻找最佳实践和行业标准的方法。

【问题讨论】:

目前还不清楚您的问题是什么。使用哪种形式的令牌(JWT、UUID、...)?要使用哪种形式的传递令牌:标头、cookie 或参数?如何在泽西岛实现身份验证/授权?还是什么? @user3707125:我在问如何通过确保 API 只能访问我们的应用程序来保护我的 REST API。这样做的方法可以是你提到的任何东西。我正在学习它,现在正在尝试实施它,但在我需要知道要学习什么之前。 “API 只能被我们的应用访问”——这是不可能的,因为客户端可以监控与服务器的通信,并模仿它。在 Web 中,您通常会在设计后端时理解前端是另一个应用程序,并且在考虑安全性时,请记住该应用程序不是您的。 我知道,我只是为了说明我在寻找什么而发表了这个声明。这并不意味着只有我们可以访问它,这意味着我们可以访问,因为我们有权这样做。您如何授权和保护您的 REST API? 认证客户端获取token后,可以确定角色。对于连续请求,用户将令牌作为标头传递。在泽西岛,我有一个过滤器(?)(不记得这个词),它将根据用户的角色和请求的路径拒绝/传递请求。 【参考方案1】:

这里是开始保护您的 API 的好地方:

    使用 HTTPS 使用用户名/密码进行身份验证 当用户成功登录后,您会为他们生成一个令牌 将令牌分配给该用户(简单的方法是将其保存在数据库中) 要求用户在每次请求时都发送该令牌 在响应任何请求之前验证令牌

话虽如此,还是有一些担忧。您应该研究如何实现这些目标:

以加密形式将凭据存储在您的数据库中,以防您的数据库遭到入侵。

如果您将令牌存储在数据库中,验证需要进行数据库查找,这会是一个问题吗,您是否预计负载会很重?

如果您使用无状态身份验证,例如 JWT,那么如果需要,您如何撤销访问权限。 (提示:查看访问+刷新令牌方案+黑名单)

如何传输令牌、标头、cookie?

保护您的 API 免受跨站脚本(又名 XSS)和跨站请求伪造(又名 CSRF 或 XSRF)。

注意:这些只是我脑海中的一些快速想法,你可以在网上找到很多关于这些的信息。

【讨论】:

谢谢。我在谷歌上搜索,它说 oAuth2 是最好的?也许它可以完成我们谈论的所有事情? OAuth2 不是很友好,但是是的,如果你能实现它就好了。您可以研究开箱即用的解决方案,例如 Auth0 或 Stormpath。 你的解释很清楚。我有几个问题。 1.“使用用户名/密码进行身份验证”是指允许用户使用其凭据登录应用程序?像 FB 用户通过 rypomg 用户名、密码登录 Facebook 一样? 是的,使用用户名和密码登录用户是最直接的身份验证方式。 好的,所以这是普通用户使用他在应用程序注册时制作的凭据登录应用程序,我认为某种硬编码密码。我还有更多问题。

以上是关于保护 REST API 的最佳方式是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 保护移动应用程序和微服务的 Rest API [关闭]

为 RESTful/HTTP RPC API 记录/生成参考的最佳工具是啥? [关闭]

将数据从 rest api 推送到 sql 数据库的最佳方法是啥?

以编程方式访问 Graphite 数据的最佳方式是啥? [关闭]

保护REST API/Web服务的最佳实践

在 C++ 中使用 PayPal 自适应支付 API 的最佳方式是啥?