회원가입

presigned url 업로드

Beany 2024-07-20

ChatGPT 요약

Presigned URL을 사용하여 다른 사용자가 AWS S3 버킷에 객체를 업로드할 수 있는 방법을 설명하는 블로그 게시물입니다. 미리 서명된 URL을 생성한 사용자의 권한에 따라 제한되며, 객체를 업로드하면 버킷 소유자가 됩니다. 또한, 객체가 이미 존재하면 새로 업로드한 객체로 대체됩니다. 이 방법은 시스템 자원을 절약하고 보안을 강화하는 데 도움이 됩니다. Presigned URL 생성에 대한 Python 코드도 제공되어 있습니다.

Presigned URL 업로드에 관해 설명하려고 합니다.

 

[ 문서 ]

미리 서명된 URL을 사용하여 다른 사람이 Amazon S3 버킷에 객체를 업로드하도록 허용할 수 있습니다.
미리 서명된 URL을 사용하면 상대방에게 AWS 보안 자격 증명이나 권한이 없어도 업로드할 수 있습니다.
미리 서명된 URL은 이를 생성하는 사용자의 권한에 따라 제한됩니다.
즉, 객체를 업로드하기 위해 미리 서명된 URL을 수신하는 경우, URL의 생성자가 해당 객체를 업로드하는 데 필요한 권한을 보유하는 경우에만 객체를 업로드할 수 있습니다.

사용자가 URL을 사용하여 객체를 업로드하는 경우 Amazon S3는 지정된 버킷에 객체를 생성합니다.
미리 서명된 URL에 지정된 것과 동일한 키를 사용하는 객체가 이미 버킷에 있다면 Amazon S3는 업로드된 객체로 기존 객체를 바꿉니다.
업로드 후에는 버킷 소유자가 객체를 소유하게 됩니다.

링크https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/PresignedUrlUploadObject.html

 

Presigned URL(미리 서명된 URL)을 처음 접하는 사람들은 이해하기 어려울 수 있습니다. 그래서 이번 글에서는 이를 이미지로단계별로 설명해 보려고 합니다.

 

먼저, 아래 이미지와 같이 사용자가 AWS에게 자신이 파일을 업로드할 수 있도록 정보를 요청합니다.

 

 

그 다음, AWS는 요청을 받아 사용자가 POST 방식으로 파일을 업로드할 수 있는 주소와 추가 정보를 전달합니다.

 

 

그 후, 사용자는 전달받은 정보를 사용해 파일을 추가로 넣어 요청을 보냅니다. 이렇게 하면 이제 S3에 해당 데이터가 저장됩니다.

 

 

이 시나리오를 보면 대충 이해가 되실 겁니다.

그렇다면 왜 이 방식을 이용할까요?

가장 큰 이유는 아래와 같습니다.

  • 메모리나 내부 시스템에 해당 파일을 저장할 필요가 없어집니다.

 

데이터 전달 방식을 보면, 어느 과정에서도 내부에 파일을 보관하지 않습니다. 이렇게 되면 시스템 자원을 절약할 수 있고, 보안도 강화됩니다.

 

Presigned URL 생성 Example 코드

def generate_pre_signed_url_info(
        file_name: str,
        _type: str = 'common',
        unique: str = '0',
        expires_in: int = 1000,
        same_file_name: bool = False
) -> dict:
    s3_client = boto3.client(
        's3',
        region_name='ap-northeast-2',
        aws_access_key_id=settings.AWS_IAM_ACCESS_KEY,
        aws_secret_access_key=settings.AWS_IAM_SECRET_ACCESS_KEY,
        config=Config(signature_version='s3v4')
    )
    try:
        key = f'{_type}/{unique}/'
        if same_file_name:
            key += f'{file_name}'
        else:
            key += f'{uuid.uuid4()}_{file_name}'
        response = s3_client.generate_presigned_post(
            Bucket=settings.AWS_S3_BUCKET_NAME,
            Key=key,
            Conditions=[
                ['content-length-range', 0, 10485760]
            ],
            ExpiresIn=expires_in
        )
        return response
    except ClientError as e:
        raise Exception(e)

 

0 0
꿀팁-개발
개발 중에 발견한 다양한 꿀팁들을 모아 두어, 미래의 나 또는 다른 개발자가 이 글을 통해 유용한 정보를 얻을 수 있는 게시글들이 모여 있는 게시판. 효율적이고 창의적인 개발을 지원하는 소중한 자료들이 모여 있는 공간입니다.
Yesterday: 456
Today: 124