所以有两个问题。
- Aws Cognito用户池的UserPoolId和AppClientId是否是机密信息?
- 如果是,如何保护它们的安全性?我看到的所有库(aws-amplify/amazon-cognito-identity-js)似乎都是完全基于客户端的。
我在这里错过了什么。看起来只需要这两个信息,就可以让任何恶意用户获得 JS 访问Cognito信息的权限。
所以有两个问题。
我在这里错过了什么。看起来只需要这两个信息,就可以让任何恶意用户获得 JS 访问Cognito信息的权限。
它们并不是秘密。
事实上,ID令牌包含iss
声明(属性),它是用户池ID,以及aud
声明,它是应用程序客户端ID。
访问令牌包含iss
声明,再次是用户池ID,而client_id
声明代表应用程序客户端ID。
如果这些令牌中的任何一个被不良分子截获,那么他们可以解码这些令牌,因为它们仅是base64编码(未加密)。
然而,仅仅知道这两个信息通常对于攻击者来说并没有太大用处,只要JWTs被正确验证即可。
它不会给攻击者访问用户池本身的权限,因为那需要AWS凭证,这些凭证只授予已经得到适当认证的用户或身份(然后由ID池发放凭证等)。
就访问API而言,攻击者可能想以某种方式修改有效载荷,以更改请求中的数据。例如,他们可能想将假设的role
声明从user
变为admin
,以升级特权并访问他们不应该访问的区域。这可以通过正确在服务器端验证JWT令牌来减轻,以确保负载未被篡改。
另一种 API 攻击的类型可能是使用一个已经正确验证的令牌来访问另一个 API(JWT 替换)。通过验证 iss
和 aud
声明,以确认 JWT 是否特定地颁发给了预期的 User Pool 和 App Client,可以缓解此问题。