> 백엔드 개발 > Golang > Go에서 AWS S3에 미리 서명된 POST 업로드를 구현하는 방법은 무엇입니까?

Go에서 AWS S3에 미리 서명된 POST 업로드를 구현하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-24 00:45:14
원래의
941명이 탐색했습니다.

How to Implement Pre-signed POST Uploads to AWS S3 in Go?

Go의 AWS S3에 사전 서명된 POST 업로드: 종합 안내서

배경

미리 서명된 POST 업로드를 통해 승인되지 않은 사용자가 안전하게 업로드할 수 있습니다. 파일을 S3 버킷에 저장합니다. 사전 서명된 PUT와 달리 이 방법은 정책 기반 승인을 사용하며 파일 전송을 단순화합니다.

미리 서명된 POST 업로드 단계

1. S3 버킷에 대한 공개 읽기 액세스 구성:

공개 읽기 액세스를 활성화하려면 다음 버킷 정책을 설정합니다.

{
    "Version": "2012-10-17",
    "Id": "akjsdhakshfjlashdf",
    "Statement": [
        {
            "Sid": "kjahsdkajhsdkjasda",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKETNAMEHERE/*"
        }
    ]
}
로그인 후 복사

2. POST 정책 생성:

POST 정책 템플릿을 생성하고 주요 필드(만료, 버킷, 키, 자격 증명, 날짜)를 입력하고 인코딩합니다.

{ "expiration": "%s",
    "conditions": [
        {"bucket": "%s"},
        ["starts-with", "$key", "%s"],
        {"acl": "public-read"},

        {"x-amz-credential": "%s"},
        {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
        {"x-amz-date": "%s" }
    ]
}
로그인 후 복사

3. 정책에 서명:

S3 버킷 소유자의 자격 증명을 사용하여 서명을 생성합니다.

  • 정책 값을 입력합니다.
  • 정책을 Base64로 인코딩합니다.
  • HMAC-SHA256 정책입니다.
  • Hex 서명을 인코딩합니다.

4. 멀티파트 양식 데이터 구성:

멀티파트 양식 데이터에 모든 정책 매개변수 포함:

func Upload(url string, fields Fields) error {
    var b bytes.Buffer
    w := multipart.NewWriter(&b)
    for _, f := range fields {
            fw, err := w.CreateFormField(f.Key)
            if err != nil {
                    return err
            }
            if _, err := fw.Write([]byte(f.Value)); err != nil {
                    return err
            }
    }
    w.Close()

    req, err := http.NewRequest("POST", url, &b)
    if err != nil {
            return err
    }
    req.Header.Set("Content-Type", w.FormDataContentType())

    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
            return err
    }
    if res.StatusCode != http.StatusOK {
            err = fmt.Errorf("bad status: %s", res.Status)
    }
    return nil
}
로그인 후 복사

리소스

  • [AWS S3 Docs: Pre- 서명됨 POST](https://docs.aws.amazon.com/AmazonS3/latest/userguide/post-object.html)
  • [GitHub: Go용 사전 서명된 POST 라이브러리](https://github .com/danlami/presigned-post/tree/main/pkg/presigned)

위 내용은 Go에서 AWS S3에 미리 서명된 POST 업로드를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿