Api Gateway+Cognito+Lambda+DynamoDB用户权限校验方案咨询
付费资源权限存储与校验方案选型分析
你提到的三种方案优劣势对比
方案1:用户权限存储在DynamoDB,请求时查表校验
- 优势:
- 灵活性最高,支持存储权限有效期、资源访问次数限制、临时授权等复杂规则,后续新增资源类型不需要改动身份侧配置
- 权限更新实时生效,用户购买后立即写入DynamoDB即可生效,不需要重新签发身份凭证
- 支持细粒度的权限审计,可记录每次校验的请求日志便于排查问题
- 劣势:
- 每次请求会多一次DynamoDB查询开销,不过DynamoDB单查询延迟通常在10ms以内,也可以通过DAX做缓存进一步降低延迟
- 需要自行维护权限表的结构、写入、过期清理逻辑
- 适用场景:后续可能扩展权限规则、权限更新频率高、需要细粒度审计的场景
方案2:Cognito自定义属性存储权限ID+有效期
- 优势:
- 校验不需要查数据库,权限信息直接存放在JWT/ID Token中,API网关侧可以直接通过Lambda Authorizer解析Token完成校验,链路更短
- 不需要额外维护权限存储表,存储成本更低
- 劣势:
- Cognito自定义属性单用户总大小上限是4KB,虽然20种资源ID加时间戳完全足够,但后续如果扩展更多资源、或者新增其他权限属性容易触顶
- 权限更新不实时,需要用户重新登录/刷新Token才能拿到最新的权限,用户付费后如果不刷新Token会暂时无权限,体验较差
- Token体积会随权限数量增加变大,请求传输开销略有上升
- 适用场景:权限变更频率低、允许短时间权限延迟生效的场景
方案3:Cognito群组对应资源类型,校验用户所属群组
- 优势:
- 配置最简单,Cognito原生支持群组校验,很多AWS服务可以直接对接Cognito群组做权限判断,不需要自行写太多校验逻辑
- Token中直接携带群组信息,校验效率高
- 劣势:
- 扩展性极差,每新增一种资源类型就要新建一个Cognito群组,后续如果资源类型增加管理成本会指数级上升
- 无法存储权限有效期这类附加属性,仅支持“有/无”权限的二元判断,不支持付费到期自动失效的需求,除非额外开发逻辑到期后把用户移出群组
- 适用场景:资源类型固定且数量极少、不需要有效期控制的场景,对你的20种付费权益资源的场景不推荐
高性价比优化方案
推荐使用 DynamoDB+缓存的混合方案,兼顾性能、灵活性和成本:
- 权限源数据还是存放在DynamoDB中,支持所有复杂规则、实时更新
- 新增一层DAX或者Redis缓存,缓存用户权限数据,过期时间设置为5~15分钟,90%以上的请求直接查缓存即可完成校验,只有缓存miss时才查DynamoDB,进一步降低查询开销
- 也可以搭配Cognito自定义属性,把常用的权限ID和有效期存在Token中,校验时先判断Token中的权限,如果Token中没有对应资源权限、或者权限已过期,再查缓存/DynamoDB,兼顾实时性和性能
- 如果是AWS生态内的服务,也可以直接用托管式权限校验服务,不需要自行开发完整的校验逻辑,按量付费对于中小流量场景成本比自行维护整套逻辑低很多
内容的提问来源于stack exchange,提问作者Szymon
相关产品推荐
相关产品推荐

