reactjs - AWS Cognito 身份服务提供商似乎将访问 token 存储在本地存储中。这安全吗?

标签 reactjs amazon-web-services amazon-cognito access-token

我们正在开发一个使用 Amplify 托管在 AWS 上的 React 前端网站的应用程序。这与运行在 EC2/Elastic Beanstalk 上的 .NET Core 3.1 Web API 进行通信。 Cognito 用于通过配置为使用 JWT token 的 Web API 进行用户身份验证。

它工作正常,但我们注意到 Cognito 提供程序将 JWT 访问 token 存储在浏览器本地存储中。这是我们在 Chrome 中使用 F12 并检查本地存储时看到的。

enter image description here

根据我们的阅读,不建议将访问 token 存储在本地存储中,因为这会使应用程序容易受到 XSS 攻击。奇怪的是,Cognito 身份提供者选择在这里存储敏感信息。

如果认为这种方法不安全,是否可以将提供程序配置为将此信息存储在其他位置,例如 cookie?

另外,当我们同时控制前端和后端时,是否有替代方法可用于保护不涉及 token 的 API?显然,API 需要知道哪个用户登录到 Web 应用程序才能执行授权检查。 [注意应用程序中的授权是记录级别的,并在数据库表中定义,因此它超越了简单的用户配置文件属性。]

非常感谢您的建议。

道格

最佳答案

安全性是一个范围而不是一项功能,因此它实际上取决于您对风险与努力的偏好。 Amplify 并不是一个特别好的代码库,它有 500 多个问题,如果您查看代码,您可能会对它的质量感到震惊。

如果您使用的是 Hosted-UI,那么您可以自己编写代码来管理 token ,而不是使用 amplify,尽管您需要了解一些有关 OAuth 授权和 OIDC 的知识。

请注意,托管 UI 缺少​​大量功能,因此如果您要使用它,请确保您对它感到满意。在我的头顶上

  • 托管 UI 中没有静默刷新功能,因此没有安全的方式来存储刷新 token 。
  • 在托管 UI 中不支持自定义身份验证流程
  • 在托管 UI 中不支持无密码
  • 无法在托管 UI 中预填充字段(例如用户名)
  • 无法在自定义 UI 中自定义过多的晦涩错误消息
  • 现在已修复,但多年来电子邮件地址都区分大小写!

另一种方法是使用 AWS SDK 直接使用 cognito-idp 获取 token ,但这也有很多问题:

  • 没有代码/PKCE/nonce 功能在移动身份验证 session 中如此不安全
  • 无法设置 oauth 范围,因此无法使用它们
  • 因此无法用于 OIDC
  • SRP 的实现很简单,离规范还很远
  • 如果您强制进行设备注册,它将在设备注册之前交付一个有效的访问 token ! (允许不可见的设备进行恶意登录)

我们使用的是领先联盟的 auth0,但由于 SMS OTP 成本(auth0 每年最低 25,000 美元),我们不得不迁移到 Cognito。

我已经使用 AWS 十多年了,Cognito 是到目前为止我用过的最糟糕的服务,而且我用过很多!如果可以避免,请这样做。

要回答最初的问题,是的,它不安全。您可能做的最好的事情就是将它们保存在内存中。如果您愿意,您可以将托管 UI 放在云端,并使用 lambda@edge 将 token 转换为 cookie。不过,这现在让您面临 CSRF 攻击。

关于reactjs - AWS Cognito 身份服务提供商似乎将访问 token 存储在本地存储中。这安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65280171/

相关文章:

javascript - 有状态 React 组件协同工作时遇到问题

reactjs - Mac M1 的 Electron 问题

linux - 脚本在后台运行时如何检查wget正在下载哪个文件?

amazon-web-services - aws Dynamodbmapper 中的可选属性

amazon-cognito - 将 Facebook "cover"属性映射到 Cognito 用户池 "Picture"属性不起作用

amazon-web-services - 创建 IAM 服务角色以允许 Amazon Cognito 为 MFA 发送 SMS 消息

javascript - 找不到模块 : Error: Cannot resolve module 'components/app' . webpack + reactjs 问题

reactjs - 如何访问子组件中的父组件状态?

python - Amazon Linux 2022 上缺少 libGL.so.1

amazon-web-services - AWS Cognito 针对不同用户池刷新 token 也会返回有效 token