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에 해당 데이터가 저장됩니다.
이 시나리오를 보면 대충 이해가 되실 겁니다.
그렇다면 왜 이 방식을 이용할까요?
가장 큰 이유는 아래와 같습니다.
데이터 전달 방식을 보면, 어느 과정에서도 내부에 파일을 보관하지 않습니다. 이렇게 되면 시스템 자원을 절약할 수 있고, 보안도 강화됩니다.
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)