使用 Amazon Cognito 实现用户认证 - User Pool 与 Identity Pool 的设计

详解 Cognito User Pool 的用户认证、Identity Pool 的 AWS 资源访问以及社交登录的集成。

Cognito 概述

Cognito 是为 Web 和移动应用程序提供认证、授权和用户管理的服务,新用户池默认的 Essentials 层级按账户或 AWS organization 计,每月最多 10,000 MAU(月活跃用户)免费(据官方定价页面,截至 2026 年 8 月)。免费额度不是按用户池计算的,因此拆分用户池也不会增加。适用对象是 Lite 和 Essentials 这 2 个层级,更高的 Plus 没有免费额度。User Pool 是用户目录,管理注册、登录和 MFA。Identity Pool 向已认证用户发放临时 AWS 凭证,实现对 AWS 资源的直接访问。支持社交登录(Google、Facebook、Apple、Amazon)和 SAML/OIDC 联合,外部 IdP 可以通过在管理控制台中注册提供商并将其分配给应用客户端来添加。但属性映射、作用域调整、登出时行为的确认都需要单独设计。

User Pool 与 Identity Pool 的区分使用

User Pool 发放 JWT 令牌(ID 令牌、访问令牌,有效期可设置为 5 分钟至 1 天),通过 API Gateway 的授权器进行验证。Identity Pool 接收 User Pool 的令牌,返回基于 IAM 角色的临时 AWS 凭证。从前端向 S3 上传文件时,使用 Identity Pool 获取的凭证直接调用 S3 SDK。可通过 Lambda 触发器实现:Pre Sign-up 限制邮箱域名、Post Confirmation 发送欢迎邮件、Pre Token Generation 添加自定义声明。两者的区分原则很明确:仅需后端 API 认证时 User Pool 的 JWT 即可,客户端需直接调用 AWS 资源(S3、DynamoDB、AppSync)时则需要并用 Identity Pool。

威胁防护与 managed login

Cognito 的威胁防护(threat protection)提供基于风险的自适应认证,根据风险级别(设备、IP 地址、登录历史)动态判断是否要求 MFA。其中还包括泄露凭证检测、威胁档案与用户活动的日志和分析及其导出,这些功能只能在功能计划 Plus 中使用(旧称为高级安全功能 = advanced security features,据官方定价页面,截至 2026 年 8 月)。可以这样运维:来自常用设备的登录跳过 MFA,来自未知设备或异常 IP 的访问则强制 MFA。也可以在自定义认证流程中使用 Lambda 触发器,实现 CAPTCHA 验证或自定义 MFA。登录界面目前以 managed login 的形式提供,使用可视化编辑器编辑品牌的功能可在 Essentials 和 Plus 中使用,通过 CSS 进行自定义的功能可在包括 Lite 在内的所有计划中使用。以往的 classic hosted UI 仍可继续使用,但可视化编辑器的对象是 managed login 的页面。向 ID 令牌添加自定义声明可以通过 Pre Token Generation 触发器实现,而在运行时自定义访问令牌的作用域和声明的功能可在 Essentials 和 Plus 中使用。

设计最佳实践与陷阱

下面列举采用 Cognito 时容易陷入的 3 个陷阱。第一,User Pool 有创建后无法更改的属性(用户名格式、必填属性),因此需在设计阶段慎重决定 Schema。若后续要改为「以邮箱作为用户名」,则需重建 User Pool 并迁移用户。第二,如果忘记配置自定义域名,Cognito 发出的默认 URL(amazoncognito.com)从防钓鱼的角度会让用户产生不信任感。建议结合 ACM 证书配置自定义域名。第三,需注意 Lambda 触发器的响应时间。Cognito 以同步方式调用 Lambda 函数,函数必须在 5 秒内响应(不等待响应的 Custom sender 触发器除外)。这一超时在 Cognito 一侧固定为 5 秒,即使延长 Lambda 函数一侧的超时设置也无法更改(据官方文档,截至 2026 年 8 月)。如果 Pre Token Generation 调用外部 API 且延迟超限,令牌发放失败,用户将无法登录。对于外部调用,需加入缓存层,或将其作为异步处理移到触发器之外,并将触发器设计为只在其中执行确定能在 5 秒内完成的处理。

与 Auth0 / Firebase Authentication 的比较

Cognito 的竞品包括 Auth0 和 Firebase Authentication。Auth0 在管理界面的易用性和文档的完善度方面表现优异,复杂认证流程(基于 Organization 的多租户、升级认证)的预设也很丰富。各服务的费用都会因计划构成和附加组件而变化,因此先确定预计的 MAU 和所需功能,再分别在各自的官方定价页面上估算,是稳妥的做法。Firebase Authentication 与 Google 生态系统(Firestore、Cloud Functions)自然集成,但在以 AWS 为中心的架构中需要额外实现 IAM 角色的集成。Cognito 最大的优势是与 AWS 服务的原生集成(API Gateway 授权器、Identity Pool 的 IAM 角色映射、与 AppSync 的直接连接),在构建以 AWS 为中心的后端时摩擦最小。如果想细致地打造认证界面,需先确认 managed login 的可视化编辑器(Essentials 和 Plus)与 CSS 自定义(所有计划)能否满足需求,无法满足时,也可以选择使用 Amplify UI 组件自行构建认证界面。

Cognito 的费用

(截至 2026 年 8 月,弗吉尼亚北部 us-east-1 与东京 ap-northeast-1)Cognito 的计费维度有 6 个。分别是用户池的 MAU(按功能计划)、SAML 2.0 / OIDC 联合用户的 MAU、机器对机器(M2M)授权的令牌请求、API 请求速率的提升、多区域复制,以及旧版高级安全功能(ASF)的附加组件。Identity Pool 的认证和唯一标识符的发放免费,M2M 应用客户端的注册数量本身也不收费。 用户池的功能计划分为 Lite、Essentials、Plus 这 3 个层级,新用户池的默认为 Essentials。单价按 MAU 计(Price List 中的单位为 CognitoUserPoolsMAU),Essentials 为每 MAU 0.015 美元,Plus 为每 MAU 0.020 美元,2 个区域价格相同。Lite 为 4 级阶梯定价,所有级别的分界都在官方定价页面的阶梯表和 Price List 的公开数据中明确列出。计费对象的前 90,000 MAU(含 10,000 免费额度在内的总 MAU 100,000 以内)为每 MAU 0.0055 美元,接下来的 900,000 MAU(总 MAU 1,000,000 以内)为每 MAU 0.0046 美元,再接下来的 9,000,000 MAU(总 MAU 10,000,000 以内)为每 MAU 0.00325 美元,超出部分为每 MAU 0.0025 美元。SAML 2.0 / OIDC 联合用户与计划构成无关,50 MAU 以内免费,超出部分为每 MAU 0.015 美元。

表:3 个功能层级的差异与单价
观察点LiteEssentials(新用户池的默认)Plus
定位2024 年 11 月 22 日及之前提供的用户池功能全集(不含 ASF)Lite 的全部功能 + managed login + 无密码登录(通行密钥、邮件、SMS)+ 访问令牌自定义 + 禁止重复使用密码Essentials 的全部功能 + 威胁防护(自适应认证、泄露凭证检测、认证事件日志导出)
登录界面仅支持 CSS 自定义可视化编辑器 + CSS 自定义可视化编辑器 + CSS 自定义
MFA认证应用与 SMS 的一次性验证码同左 + 邮件一次性验证码同左 + 基于风险的动态启用
免费额度(每月、按账户或 organization 计)10,000 MAU10,000 MAU无(所有 MAU 均计费)
超出部分的单价(弗吉尼亚北部与东京同价)从 0.0055 USD/MAU 起阶梯式递减0.015 USD/MAU0.020 USD/MAU
多区域复制不可用可通过附加组件使用(0.0045 USD/MAU)可通过附加组件使用

附加组件的计费单位各不相同。M2M 授权按每次成功的令牌响应计费,前 250,000 次请求为每次令牌请求 0.00225 美元(单位为 CognitoUserPools-M2MTokens),接下来的 4,750,000 次请求(至 5,000,000 次请求为止)为 0.0015 美元,超过 5,000,000 次请求的部分为 0.001125 美元。同时使用多区域复制时,第一级为 0.002925 美元。API 请求速率的提升按超出默认配额的增量每 1 RPS 按月计费,并按 API 类别分别计费(单位为 CognitoUserPoolsRPSMo,最短期限 1 天)。在整月适用时,增量每 1 RPS 为 20.00 美元;只在月内部分时间适用时,增量每 1 RPS 的 45.00 美元按天数折算。旧版 ASF 附加组件为按 MAU 计的 5 级阶梯定价,前 50,000 MAU 为每 MAU 0.05 美元,接下来的 50,000 MAU 为每 MAU 0.035 美元,接下来的 900,000 MAU(至 1,000,000 MAU 为止)为每 MAU 0.02 美元,接下来的 9,000,000 MAU(至 10,000,000 MAU 为止)为每 MAU 0.015 美元,超出部分为每 MAU 0.01 美元。ASF 没有免费额度,不扣除 10,000 MAU 的免费额度而对全部 MAU 计费,这一点与 Essentials 和 Plus 不同。 免费额度与例外有 5 点。第一,通过直接登录或社交 IdP 登录的 10,000 MAU 免费额度只适用于 Lite 和 Essentials,Plus 没有免费额度。该额度不会随 AWS 免费套餐的 12 个月而失效,对现有客户和新客户都无限期适用,但不适用于 AWS GovCloud(US)。第二,2024 年 11 月 22 日及之前创建的现有用户池保留前 50,000 MAU 的免费额度。第三,ASF 不再向新客户提供,是已在使用 ASF 的客户能以原有价格继续使用的附加组件(据 AWS 的说明,与 ASF 相比 Plus 最多可节省 60%,ASF 在 AWS GovCloud(US-West)中不可用)。第四,M2M 的令牌请求没有免费额度。第五,因 MFA、注册、密码恢复、电话号码验证而发送的 SMS 需另付 Amazon SNS 的费用,因注册、密码恢复、邮箱地址验证而发送的邮件需另付 Amazon SES 的费用。举一个计算示例:使用 Essentials、950,000 MAU 时为(950,000 - 10,000)× 0.015 美元 = 每月 14,100 美元,同样规模使用 Plus 时由于没有免费额度,为 950,000 × 0.020 美元 = 每月 19,000 美元。由于按 MAU 计费,已注册但未登录的用户不影响成本。

总结

Cognito 是通过 User Pool 提供用户认证、通过 Identity Pool 提供 AWS 资源访问的服务。通过社交登录和 SAML/OIDC 联合与外部 IdP 集成,在功能计划 Plus 中还能借助威胁防护动态应用基于风险的 MFA。与 AWS 服务的原生集成是其最大优势,在初期阶段慎重设计 User Pool 的 Schema 是长期运营的关键。

参考资料(AWS 官方)

本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。

如本页内容与官方文档不一致,请以官方文档为准。

分享