S3에 저장된 이미지나 동영상 파일을 웹 애플리케이션에서 보여줄 때 모든 파일을 퍼블릭으로 공개하는 것은 보안상 위험이 따르거든요. 이럴 때 유용하게 사용하는 방법이 바로 Presigned URL을 생성하여 임시로 접근 권한을 부여하는 방식이에요. 특정 사용자에게만 일정 시간 동안 파일에 접근할 수 있는 고유한 URL을 만들어 전달하면, 버킷 자체를 공개하지 않고도 안전하게 콘텐츠를 제공할 수 있답니다. 특히 대용량 파일이나 개인정보가 포함된 문서를 처리할 때 이 방식이 실무에서 아주 유용하게 쓰여요.
import boto3
from botocore.exceptions import ClientError
# 버킷 이름과 객체 키를 인자로 받아 presigned URL을 생성합니다.
def generate_presigned_url(bucket_name, object_key):
s3_client = boto3.client('s3')
try:
response = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': bucket_name, 'Key': object_key},
ExpiresIn=3600 # 1시간 유효
)
except ClientError as e:
return None
return response
Presigned URL은 AWS Signature Version 4 방식을 기반으로 생성되며, 요청 시 포함된 만료 시간을 체크하여 접근을 허용하는 원리예요. 이 기능이 제대로 작동하려면 몇 가지 전제 조건이 필요한데, 우선 S3 버킷에 대한 적절한 IAM 권한이 부여되어 있어야 해요. 단순히 URL을 생성한다고 해서 바로 접근이 가능한 것이 아니라, 해당 링크를 생성하는 주체인 IAM 역할이나 사용자 계정이 실제 객체에 접근할 수 있는 권한을 가지고 있어야 하거든요. 또한 리전 정보가 명확하게 포함되어야 다른 지역의 요청을 처리할 때 오류가 발생하지 않더라고요.
실무에서 이 기능을 구현할 때 주의해야 할 중요한 포인트 중 하나는 서버의 시스템 시간이 매우 정확해야 한다는 점이에요. 인증 정보를 생성하는 과정에서 현재 시간을 기반으로 서명(Signature)을 만들기 때문에, 서버 시계와 실제 시간 사이에 차이가 발생하면 접근 거부 오류가 나타날 수 있거든요. 또한 보안을 위해 만료 시간을 최소한으로 설정하고, 사용자가 요청할 때마다 동적으로 URL을 생성하여 제공하는 방식이 권장되더라고요. 이렇게 하면 링크가 유출되더라도 일정 시간이 지나면 무효화되기 때문에 훨씬 안전하게 관리할 수 있어요. 추가로 S3 버킷 정책이나 ACL이 복잡하게 얽혀 있는 경우, 의도치 않은 권한 거부가 발생할 수 있으니 최소 권한 원칙을 적용하여 접근 범위를 제한하는 것이 좋답니다.
'develop > Cloud' 카테고리의 다른 글
| AWS Lambda VPC 연결 시 인터넷 통신 및 DNS 해결 설정 (0) | 2026.07.27 |
|---|---|
| AWS ECS 태스크 역할과 실행 역할 권한 분리 설정 (0) | 2026.07.20 |