【发布时间】:2022-12-10 22:40:56
【问题描述】:
我正在使用 Cognito 来验证我的客户(UI+身份池)
我正在使用 Authentication code grant 而不是 Implicit grant。
如果我理解正确的话,代码可以在我的后端交换一个 JWT,而我的客户端只处理身份验证代码。因此,客户端永远不知道 JWT,我可以随时撤销它。 我必须在我的后端内存中存储对应于 cod:jwt 的键值关联
在每次 API 请求时,我都会获得与代码关联的 jwt,然后我可以进行验证
你能确认我已经正确理解了这个机制吗?
我使用的是无状态的 AWS Lambda,所以我无法将 code:jwt 关联存储在我的 lambda 内存中,因为一旦 lambda 死亡,我就无法再访问数据。
所以我有几个解决方案。
-
我将我的代码和我的 jwt 存储在一个 RDS 实例中:我认为这不是最好的解决方案,因为每个 API 请求都需要查询 RDS
-
我存储在 dynamoDB 实例中
-
AWS MemoryDB:我认为这是一个很好的解决方案,但它太贵了!!
-
ElastiCache:它使用内存,但我不太了解价格
-
使用 JWT 代替代码,但它不是 AWS 推荐的最安全的解决方案
你应该知道我正在做的项目是一个个人项目,那里不会有太多流量,但我想设置所有必要的系统让我扩展 这个项目的目的是让我更深入地了解云技术,并面对可能发生的问题。
所以我试图在性能方面找到最优化的解决方案,但也在成本方面(因为我不会有很多数据和用户)。所以我想在流量不多的时候利用免费/便宜的优惠。 例如,如果我使用 MemoryDB 我将至少支付 30 欧元,而我没有流量,我正在做我的项目只是为了学习......它变得越来越贵
希望您能理解我的问题并帮助我找到正确的解决方案。 几天后,我希望有更多的意见来构建并确定我将采用的解决方案。
【问题讨论】:
-
如果通过 TLS 进行通信并且不存储敏感数据 imo,JWT 是无服务器应用程序的可行解决方案。如果您需要存储键/值对、失效令牌等,那么 DynamoDB 应该是一个重要的考虑因素。
-
感谢您的回答! DynamoDB 提供良好的性能?如果我每次查询请求dynamoDB通过代码获取jwt没有问题吗?为什么使用 dynamoDB 而不是像 Elasticache 这样的内存数据库?谢谢 :)
-
理想情况下,JWT 包含您需要的(并已签名),因此您无需对每个请求都进行数据库查找。在 DynamoDB 与 ElastiCache 上,您可以研究 differences,但持久性、PITR 备份、IAM 授权、复制、流、较小工作负载的低成本可能是 DynamoDB 的优势。
-
如果您关心立即撤销 JWT 令牌,那么您必须提取 JWT 令牌信息并根据您的用户帐户数据库对其进行验证,以确保用户帐户在每次请求时仍然“活跃”,或者您需要存储 JWT令牌本身,并根据您存储的令牌验证收到的令牌。您会在网上(在博客等中)找到的大多数 JWT 实现实际上并不处理即时令牌撤销,只是通过到期最终撤销令牌。
-
要在 AWS 中存储 JWT 令牌,您可以使用 DynamoDB 或 Redis (ElastiCache)。 DynamoDB 是一种无服务器解决方案,可以更好地与您的无服务器 Lambda 后端配合使用,但它的性能通常不如 Redis。您可以添加 DynamoDB 加速器 (DAX) 以使其在 Redis 上具有高性能,但它不再是完全无服务器的,而且成本也不再低于 Redis。这完全取决于您可以接受的性能类型,以及您可以接受的基础架构成本。
标签: amazon-web-services authentication aws-lambda jwt