S3는 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 저장소(Object Storage)이다.
1. 핵심 개념: 버킷(Bucket)과 객체(Object)
- 버킷(Bucket): S3의 최상위 컨테이너이다 (파일 시스템의 ‘드라이브’ 개념) 전 세계에서 유일한 이름을 가져야 한다.
- 객체(Object): S3에 저장되는 기본 단위이다. 파일 본체와 메타데이터(파일 형식, 크기 등)로 구성된다.
- 키(Key): 객체의 고유한 식별자이다. 보통 파일 경로 형태(
images/profiles/user1.png)로 사용한다.
2. 백엔드 개발자가 자주 사용하는 3가지 업로드 방식
2.1. 서버 중계 방식 (Server-side Upload)
- 흐름: 클라이언트 → 백엔드 서버 → S3
- 장점: 서버에서 파일 검증(바이러스 체크, 리사이징)이 가능하다.
- 단점: 대용량 파일 업로드 시 서버의 메모리와 네트워크 대역폭을 많이 소모한다.
2.2. Pre-signed URL 방식
- 흐름
- 클라이언트가 백엔드에 업로드 권한을 요청
- 백엔드는 S3로부터 유효기간이 짧은 임시 URL을 발급받아 클라이언트에 전달
- 클라이언트는 S3로 직접 파일 업로드
- 장점: 서버 부하가 전혀 없으며 보안성도 높다.
2.3. Multipart Upload
- 특징: 아주 큰 파일(GB 단위)을 조각내어 병렬로 업로드한다. 업로드 중 끊겨도 실패한 조각부터 다시 시작할 수 있다.
3. 실무 실패 기능 및 설정
3.1. 스토리지 클래스 (Storage Classes)
비용 최적화를 위해 데이터 액세스 빈도에 따라 저장소 등급을 나눈다.
- Standard: 자주 접근하는 데이터용 (일반적인 이미지/동영상)
- Intelligent-Tiering: 액세스 패턴이 변하는 데이터에 대해 자동으로 비용을 절감.
- Glacier: 거의 접근하지 않는 장기 보관용 데이터(로그, 백업). 비용이 매우 저렴하지만 꺼내는 데 시간이 걸린다.
3.2. 정적 웹 사이트 호스팅
- S3 버킷에 HTML, CSS, JS 파일을 넣고 설정만 하면 별도의 서버 없이 웹 사이트를 띄울 수 있다
3.3. 버전 관리 (Versioning)
- 실수로 파일을 덮어쓰거나 삭제했을 때 이전 버전으로 복구할 수 있는 기능이다.
4. 보안 및 접근 제어
- 퍼플릭 액세스 차단 (Public Access Block): 실수로 데이터가 전 세계에 공개되는 것을 막기 위해 기본적으로 켜두어야 한다.
- 버킷 정책 (Bucket Policy): JSON 형식으로 특정 IP나 특정 서비스(CloudFront 등)만 접근 가능하도록 정의한다.
- IAM 역할 (IAM Role): EC2나 Lambda가 S3에 접근할 때 액세스 키를 코드에 넣지 않고, IAM 역할을 부여하여 안전하게 통신한다.
5. 백엔드 개발자의 체크리스트
- 파일 이름 난독화: 사용자 ID 등 파일명에 그대로 쓰지 말고 UUID 등을 사용하여 파일명을 난독화했는가? (보안 및 덮어쓰기 방지)
- Lifecycle 설정: 오래된 로그나 임시 파일이 자동으로 삭제되거나 Glacier로 이동하게 설정했는가? (비용 절감)
- CloudFront 연동: 전 세계 사용자에게 빠르게 파일을 서빙해야 한다면 S3 앞에 CDN 서비스인 CloudFront를 붙였는가?
- 용량 제한: 클라이언트가 악의적으로 너무 큰 파일을 올리지 못하도록 백엔드가 S3 정책에서 크기 제한을 걸었는가?