You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在客户端使用AWS SDK读取S3对象是否安全?

问题

我看到过不同观点,希望获得专业解答。我的问题很基础:若创建纯客户端React应用,计划从中读取S3对象,以下方案是否安全?我的环境变量仅存储在Netlify中。此前我有过类似配置,AWS账户曾遭入侵,但不确定是否因该方案导致。

相关代码

aws-exports.js

import { config } from 'aws-sdk'
const AWSConfig = {
    accessKeyId: process.env.REACT_APP_AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.REACT_APP_AWS_SECRET_ACCESS_KEY,
    region: process.env.REACT_APP_AWS_REGION,
}
config.update(AWSConfig)

s3.js

import { S3 } from 'aws-sdk'

class S3Singleton {
    static instance = undefined
    static async getInstance() {        
        if (S3Singleton.instance) {
            return S3Singleton.instance
        }
        S3Singleton.instance = await S3Singleton.createInstance()
        return S3Singleton.instance
    }
    static createInstance = async () => {
        return new S3({
            apiVersion: process.env.REACT_APP_AWS_API_VERSION,
            region: process.env.REACT_APP_AWS_REGION,
            params: { Bucket: process.env.REACT_APP_AWS_BUCKET },
        })
    }
}
export default S3Singleton

S3对象读取代码

import S3Singleton from './s3'

export const getXFile = async () => {
  try {
    const s3 = await S3Singleton.getInstance()

    return await new Promise((resolve, reject) => {
      s3.getObject(
        {
          Bucket: process.env.REACT_APP_BUCKET,
          Key: "xfile.json",
        },
        (err, data) => {
          if (err) reject(err)
          if (data) resolve(JSON.parse(data.Body.toString()))
        },
      )
    })
  } catch (e) {
    console.log(e)
  }
}
解答

这个方案完全不安全,你的AWS账户入侵大概率就是因为这个配置导致的。

核心原因:React应用构建时,所有REACT_APP_前缀的环境变量都会被打包到前端静态代码中。哪怕你把变量存在Netlify,最终这些密钥还是会被注入到客户端JS文件里——任何人只要打开浏览器开发者工具,查看源代码或网络请求,就能轻松获取你的accessKeyId和secretAccessKey。

这两个密钥等同于AWS账户的“用户名+密码”,拿到它们的人可以执行该权限下的所有操作:不止读取S3桶,还可能创建资源、删除数据、产生高额账单,甚至获取其他AWS服务的权限。

正确替代方案

  • 公开只读S3桶(仅适用于无敏感内容场景):给S3桶配置Bucket Policy,允许所有用户只读访问指定对象,前端直接通过公开URL获取文件,无需AWS密钥。
  • AWS Cognito未认证身份:通过Cognito给未登录用户分配临时、受限的AWS身份,仅允许读取指定S3对象。客户端不会暴露长期有效密钥,而是获取临时凭证,权限可严格管控。
  • 后端代理请求:用Netlify Functions、AWS Lambda等后端服务处理S3读取,前端调用后端接口获取文件内容,AWS密钥仅存于后端环境,客户端完全接触不到。
  • S3预签名URL:由后端生成带有效期的预签名URL,前端通过该URL直接访问S3对象,URL过期后失效,且权限仅限于指定对象。

内容的提问来源于stack exchange,提问作者Duveral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:49:53