클라이언트가 웹에서 이미지 및 파일 첨부 기능을 사용할 수 있도록,
AWS S3 버킷 생성부터 권한 설정 SpringBoot 연동까지 실습합니다.
S3를 사용하려면 먼저 버킷(Bucket)을 생성해야 합니다.
버킷은 AWS에서 객체(Object)를 저장하는 최상위 컨테이너로, 인터넷 도메인처럼 동작합니다.
만약 같은 이름의 버킷이 2개라면,
https://{버킷명}.s3.{리전}.amazonaws.com/...
URL이 겹쳐 누구의 파일인지 구분할 수 없습니다.
..), IP 주소 형식 (192.168.0.1)실습 목적이라면,
S3에 어디서든 접근 가능하도록 “모든 퍼블릭 액세스 차단”을 해제합니다.
이후 나머지 설정은 그대로 두고, [버킷 만들기]를 클릭합니다.
⚠️ 단, 실제 운영 환경에서는 절대 퍼블릭 액세스 차단 해제를 권장하지 않습니다.
모든 파일이 인터넷에 노출되어 보안에 심각한 문제가 발생할 수 있으니,
실습 후에는 반드시 퍼블릭 접근을 제한하거나, 최소한의 권한만 부여하세요.
이후 나머지 설정은 그대로 둔 뒤 버킷 만들기 클릭
S3 버킷 생성 시, 자신의 서비스, 서버, 또는 주요 사용자의 물리적 위치와 가장 가까운 리전을 선택해야 합니다.
예를 들어, 서울이나 수도권에서 주로 서비스를 제공한다면 네트워크 지연 시간을 최소화하여 파일 업로드·다운로드 속도가 빨라지고, 전체적인 서비스 품질도 크게 향상되므로 ap-northeast-2(서울) 리전이 가장 적합합니다.
서비스 서버가 도쿄에 있다면 ap-northeast-1(도쿄)를, 싱가포르에 있다면 ap-southeast-1(싱가포르)를 선택하면 지역 간 전송 지연을 최소화할 수 있습니다.
앞서 모든 퍼블릭 액세스 차단을 해제했더라도,
버킷의 객체(파일)에 대한 접근 권한은 기본적으로 차단되어 있습니다.
따라서, 실제로 파일 접근을 허용하려면 추가 설정이 필요합니다.
필자는 다음과 같이 접근 권한을 설정할 계획입니다.
사용자들이 웹사이트에서 이미지를 보거나 다운로드하려면
S3의 이미지 파일에 접근(읽기) 권한이 있어야 합니다.
그래서 GetObject 권한을 누구나(Everyone) 사용할 수 있도록 설정합니다.
아무나 이미지를 S3에 올릴 수 있으면
스팸, 악성코드, 불법 파일 업로드 등 보안 문제가 생길 수 있습니다.
따라서 PutObject 권한은 내 백엔드 서버만 갖도록 설정합니다.
(예: 서버가 AWS의 IAM Role을 이용해 S3에 직접 업로드)
나의 백엔드 서버만 S3에 이미지를 업로드할 수 있도록 설정합니다.
이를 위해 IAM 유저를 생성하고,
해당 유저에게 S3 업로드 권한(PutObject 등)을 부여한 뒤
액세스 키(Access Key, Secret Key)를 통해 서버에서 S3에 접근합니다.
S3 API만 사용할 IAM 유저를 만들 것이므로,
[AWS Management Console에 대한 사용자 액세스 권한 제공]은 체크 해제했습니다.
이렇게 하면,
이 유저는 웹 콘솔(관리자 화면)에 로그인할 수 없고,
오직 Access Key를 이용해 프로그래밍 방식(S3 연동 등)으로만 AWS 자원에 접근할 수 있습니다.
‘직접 정책 연결’
→ AWS가 자주 사용하는 권한 세트를 미리 만들어 놓은 기능입니다.
여기서 AmazonS3FullAccess 정책을 추가하면,
→ 해당 IAM 유저는 S3의 모든 버킷 및 객체에 대해 완전한 접근 권한을 갖게 됩니다.
‘직접 정책 연결’
→ 선택만 하면 권한이 바로 적용됨
AmazonS3FullAccess
→ 모든 S3 작업(읽기, 쓰기, 삭제 등) 전체 허용
⚠️ 실무 TIP
개발/테스트 환경에서는 편리하게 쓸 수 있지만,
운영 환경에서는 꼭 필요한 권한만 최소한으로 부여하는 것이 보안상 더 안전합니다.
필자는 AWS EC2에서 S3에 접근하는 Spring Boot 서버를 구동할 예정이기 때문에,
AWS 컴퓨팅 서비스에서 실행되는 애플리케이션 사용 사례를 선택했습니다.
❗️ 하지만, 이 사용 사례 구분은 “일종의 가이드라인”일 뿐이며,
어떤 옵션을 선택해도 실제 권한 동작에는 차이가 없습니다.
다만, 추후 유지보수와 관리의 편의성을 고려해 상황에 맞는 사용 사례를 선택하는 것이 좋습니다.
S3 인프라 설정이 이로써 기본적으로 마무리되었습니다.
다음 포스트에서는 Spring Boot와 S3 연동 방법을 다룰 예정입니다.
궁금한 점이나 피드백은 댓글로 남겨주세요!