kookmin-sw / capstone-2023-08

capstone-2023-08 created by GitHub Classroom
1 stars 4 forks source link

S3 presigned url 반환 api 구현 완료 #79

Closed wynter122 closed 1 year ago

wynter122 commented 1 year ago

6 #55 에 관련된 PR 입니다.

작업내용

s3 의 user-human-img 버킷에 사용자별 이미지를 보관하기위해 일시적인 접근 권한이 필요합니다. 현재 버킷의 정책은 다음과 같이 지정되어있습니다.

image

클라이언트

서버 예시로 다음과 같이 url 반환

image

추가적인 정보

url 의 유효 seconds 는 여유잡아서 300초로 지정했습니다.

lucyya99 commented 1 year ago

presigned-url은 그대로 진행해도 될 것 같은데 aws 설정하는거 두 가지만 추가주세요!

  1. 제 코드에서 put을 사용해서 넣기 때문에 버킷 정책에 해당 내용 넣어주심 될 것 같아요
{
    "Version": "2012-10-17",
    "Id": "Policy1679298878034",
    "Statement": [
        {
            "Sid": "Stmt1679298863378",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::flutter-img-test/*"
        }
    ]
}
  1. CORS(Cross-origin 리소스 공유)도 마찬가지로 PUT이 들어가있는지 확인해주세요!
    [
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2"
        ],
        "MaxAgeSeconds": 3000
    }
    ]

고생하셨어요!

wynter122 commented 1 year ago

@lucyya99

{
    "Version": "2012-10-17",
    "Id": "Policy1679298878034",
    "Statement": [
        {
            "Sid": "Stmt1679298863378",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::flutter-img-test/*"
        }
    ]
}

위 내용에서 정확히 무슨 내용을 넣어야하는지 알 수 있을까요? 예를들어 Resource 의 경우 저희 서비스에서 사용하는 실제 s3 버킷의 arn 을 삽입해야합니다. 현재 명시하신 정책에서는 예지님의 테스트용 s3 arn 같네요. 그 외에 principal의 경우에도 * 오퍼레이터를 넣게 되면 보안상 취약해집니다. 필수적으로 넣어야하는 정책이 무엇인지, 해당 정책은어떤것을 의미하는지 알려주시면 좋겠습니다.

CORS 의 경우 s3 -> 외부로 데이터를 불러올 때 필요한 정책으로 알고있습니다. 해당 버킷에서는 클라이언트단에서 s3 에 put 하기 위한 정책만 필요하기 때문에 CORS 설정은 불필요하다고 생각되는데 CORS 가 필요한 이유가 있나요?

+ 추가개발 사항이나 관련해서 처리할 이슈가 있다면 approve 나 merge 를 하지 않는게 일반적이니 참고하시면 좋을 것 같아요!! :)

wynter122 commented 1 year ago

기존에 s3 정책에서 GetObject 가 아닌 PutObject 가 필요할 것 같아 다음과 같이 수정해둔 상태입니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::705158357653:user/server"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::user-human-img",
                "arn:aws:s3:::user-human-img/*"
            ]
        }
    ]
}

presigned url 을 생성하는 코드는 ec2 server 에 반영해두었으니 서버 켜서 api 요청 보내 동작 확인 해보시면 되겠습니다. 오류가 있거나 업로드가 잘 되지 않는다면 꼭 오류 메세지와 함께 알려주세요.