在静态网页上保护 AWS Cognito 用户池和客户端 ID

Posted

技术标签:

【中文标题】在静态网页上保护 AWS Cognito 用户池和客户端 ID【英文标题】:Securing AWS Cognito User Pool and Client ID on a static web page 【发布时间】:2017-05-07 18:34:05 【问题描述】:

来自 AWS 文档 (Specifying User Pool App Settings):

开发者有责任保护任何应用客户端 ID 或 秘密,以便只有授权的客户端应用程序才能调用这些 未经身份验证的 API。

那么是否有任何架构可以在安全条件下进行身份验证(不在静态网页上公开客户端 ID)。

AWS samples 明确客户 ID,因此不符合文档建议。此外,任何攻击者都可以使用静态 Web 客户端 ID 对 Cognito 未经授权的 API 执行暴力攻击。有什么办法可以避免吗?

【问题讨论】:

【参考方案1】:

当您同时使用 App Client ID 和 Secret(通常在移动开发中)时,他们的建议适用。

当您创建应用程序时,您可以选择创建一个秘密 对于那个应用程序。如果为应用创建了密钥,则该密钥必须是 提供使用该应用程序。基于浏览器的应用程序 javascript 可能不需要有秘密的应用程序。

当您在网络上使用 Cognito 时,您不需要生成 Secret(在您的用户池中创建应用程序时取消选中该框)。这确实在客户端上以明文形式留下了 App Client Id,但这种情况没有额外的风险,而不是将登录页面暴露在开放的互联网上:无论如何,攻击者都可能试图暴力破解您的登录。

我确信亚马逊在这种情况下所做的(这是人们在自定义登录实现的情况下应该做的)是防御受限制的请求、将 IP 列入黑名单等,这从本质上减缓了攻击者的速度在不可行或不值得执行蛮力攻击的情况下。

简而言之,您不必担心将 App Client Id 嵌入您的 Web 前端代码中。

希望这会有所帮助!

【讨论】:

【参考方案2】:

为了阐明这个话题。 Client Secret 是来自 OAuth2 的一个概念here:

如果开发人员正在创建“公共”应用(移动或单页应用),那么您根本不应该向应用发布 client_secret。这是确保开发人员不会意外将其包含在他们的应用程序中的唯一方法。不存在就不能泄露!

Client Secret 仅应在您构建网络服务器应用程序或非面向公众的应用程序时使用。

【讨论】:

以上是关于在静态网页上保护 AWS Cognito 用户池和客户端 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

使用 AWS Cognito 保护 REST API

Cognito 用户池作为具有客户端凭据的身份提供者仅在保存到 aws 控制台后才有效

通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户

通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)

API Auth 类型的 Cognito 用户池和 API 密钥之间的区别