安全地从S3提供内容

时间:2015-12-26 07:12:20

标签: amazon-web-services go amazon-s3

我正在编写一个Web应用程序,我使用amazon s3存储所有用户文件,包括配置文件图片以及文本和音频文件。

但是我很难理解安全地做这件事的正确方法。我想的是在确认请求来自可以访问所请求文件的经过身份验证的用户之后,只需使用aws go库来获取文件并将其写入http请求。

这样的事情:

import (
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
    "io"
)

func serveFile(file string, w http.ResponseWriter) {
    svc := s3.New(session.New(), aws.NewConfig().WithRegion(config.AWS.Region))

    params := &s3.GetObjectInput{
    Bucket: aws.String("Bucket name"),
    Key:    aws.String(file),
    }

    resp, err := svc.GetObject(params)
    n, err := io.Copy(w, resp.Body)

}

我没有多少使用AWS的经验,因此我不确定这是一个好方法,但它确实有效。对于生产服务器来说,这是一个很好的方法吗?有更好,更可靠的方式吗?

2 个答案:

答案 0 :(得分:6)

这种方法可行。但它依赖于通过您的客户端代理的请求。

推荐的方法是使用签名的网址。这将创建一个在您指定的时间段内有效的URL,该时间段允许最终用户直接从S3下载文件。

您的密钥未公开,因为网址仅包含签名。

答案 1 :(得分:0)

这是一个很好的解决方案,原因如下:

  • 您使用S3的事实对客户端是透明的。换句话说,客户并不需要或应该知道您在后端使用S3,除非有充分的理由。

  • 明天,如果您想将数据从S3移动到其他数据存储,则只需更改服务器代码即可。客户不需要更新。

  • AWS凭据不会暴露给客户,因此更具安全性。