AWS S3 기초 완벽 가이드: 버킷, 객체, 권한의 모든 것
AWS S3의 핵심 개념인 버킷, 객체, 권한 관리를 초보자도 쉽게 이해할 수 있도록 상세히 설명합니다. SAA-C03 시험 대비 필수 내용 포함.
관련 시험 도메인
- Domain 1: Design Secure Architectures
- Domain 3: Design High-Performing Architectures
핵심 요약
시험 팁
S3 시험 핵심 포인트: S3는 객체 스토리지이며 파일 시스템이 아닙니다. 버킷은 글로벌 고유 이름이 필요하고, 기본적으로 모든 버킷과 객체는 프라이빗입니다. 2023년 4월부터 S3 퍼블릭 액세스 차단이 기본 활성화되며, ACL보다 버킷 정책과 IAM 정책을 통한 권한 관리가 권장됩니다.
| 구분 | 핵심 내용 |
|---|---|
| 버킷(Bucket) | 객체를 저장하는 컨테이너, 글로벌 고유 이름 필요, 리전에 생성 |
| 객체(Object) | 데이터 + 메타데이터, 최대 5TB, 키(경로)로 식별 |
| 권한 관리 | IAM 정책 + 버킷 정책 조합 권장, ACL은 레거시 |
| 기본 보안 | 모든 버킷/객체는 기본 프라이빗, 퍼블릭 액세스 차단 기본 ON |
S3란 무엇인가?
**Amazon S3(Simple Storage Service)**는 AWS의 핵심 스토리지 서비스로, 객체 스토리지 방식을 사용합니다.
객체 스토리지 vs 블록/파일 스토리지
| 특성 | 객체 스토리지 (S3) | 블록 스토리지 (EBS) | 파일 스토리지 (EFS) |
|---|---|---|---|
| 데이터 단위 | 객체 (파일 + 메타데이터) | 블록 | 파일/폴더 |
| 접근 방식 | HTTP/HTTPS API | OS 마운트 | NFS 프로토콜 |
| 수정 방식 | 전체 객체 교체 | 블록 단위 수정 | 파일 단위 수정 |
| 확장성 | 무제한 | 볼륨 크기 제한 | 페타바이트 |
| 지연 시간 | 밀리초 | 마이크로초 | 밀리초 |
| 사용 사례 | 정적 파일, 백업, 아카이브 | 데이터베이스, OS 볼륨 | 공유 파일 시스템 |
시험 팁
시험 포인트: S3는 객체 전체를 교체해야 하므로 자주 수정되는 데이터에는 적합하지 않습니다. 데이터베이스 파일이나 로그 파일처럼 자주 업데이트되는 데이터는 EBS를 사용하세요.
S3 버킷(Bucket)
버킷이란?
버킷은 S3에서 객체를 저장하는 최상위 컨테이너입니다. 폴더처럼 보이지만, 실제로는 플랫(flat)한 구조입니다.
버킷의 핵심 특성
버킷 이름 규칙:
├── 글로벌 고유 (전 세계 모든 AWS 계정에서 유일해야 함)
├── 3-63자 길이
├── 소문자, 숫자, 하이픈만 사용
├── 문자 또는 숫자로 시작
└── IP 주소 형식 불가 (예: 192.168.1.1)
| 특성 | 설명 |
|---|---|
| 글로벌 고유 이름 | 전 세계 모든 AWS 계정에서 버킷 이름이 유일해야 함 |
| 리전 지정 | 버킷은 특정 리전에 생성되며, 데이터는 해당 리전에 저장 |
| 계정당 제한 | 기본 100개 (요청 시 1,000개까지 증가 가능) |
| 삭제 조건 | 버킷이 비어있어야 삭제 가능 |
버킷 네이밍 모범 사례
좋은 예시:
✅ my-company-app-logs-2026
✅ prod-backup-us-east-1
✅ data-lake-raw-zone
나쁜 예시:
❌ MyBucket (대문자 불가)
❌ my_bucket (언더스코어 불가)
❌ my..bucket (연속 점 불가)
❌ -mybucket (하이픈으로 시작 불가)
S3 객체(Object)
객체의 구성 요소
S3 객체는 다음 요소로 구성됩니다:
S3 객체 구조
├── Key (키)
│ └── 객체의 고유 식별자 (전체 경로)
│ └── 예: photos/2026/vacation/beach.jpg
├── Value (값)
│ └── 실제 데이터 (파일 내용)
│ └── 최대 5TB
├── Metadata (메타데이터)
│ ├── 시스템 메타데이터: Content-Type, Last-Modified 등
│ └── 사용자 정의 메타데이터: x-amz-meta-* 헤더
├── Version ID
│ └── 버전 관리 활성화 시 생성
└── Subresources
├── ACL (Access Control List)
└── Torrent
객체 키(Key)와 가상 폴더
S3는 플랫 구조이지만, 키에 슬래시(/)를 사용하여 폴더처럼 보이게 할 수 있습니다.
버킷: my-photos-bucket
├── photos/2026/january/photo1.jpg ← 키(Key)
├── photos/2026/january/photo2.jpg
├── photos/2026/february/photo3.jpg
└── documents/report.pdf
실제로는 폴더가 아닌 4개의 독립적인 객체!
시험 팁
시험 포인트: S3에는 실제 폴더/디렉토리 개념이 없습니다. 콘솔에서 보이는 폴더는 키의 접두사(prefix)를 시각화한 것입니다. "photos/2026/"은 접두사(prefix)입니다.
객체 크기 제한
| 작업 | 제한 |
|---|---|
| 단일 PUT | 최대 5GB |
| 멀티파트 업로드 | 최대 5TB (필수: 100MB 이상) |
| 최소 파트 크기 | 5MB (마지막 파트 제외) |
| 최대 파트 수 | 10,000개 |
업로드 방식 선택:
├── 0 ~ 100MB: 단일 PUT 권장
├── 100MB ~ 5GB: 멀티파트 권장
└── 5GB ~ 5TB: 멀티파트 필수
S3 권한 관리
권한 관리 방식 비교
S3의 권한은 여러 메커니즘을 통해 관리할 수 있습니다:
| 방식 | 적용 대상 | 주요 사용 사례 |
|---|---|---|
| IAM 정책 | IAM 사용자/역할 | 내부 사용자 권한 관리 |
| 버킷 정책 | 버킷 | 크로스 계정 액세스, 퍼블릭 액세스 |
| ACL | 버킷/객체 | 레거시, 권장하지 않음 |
| S3 Access Points | 버킷 | 대규모 공유 데이터셋 |
IAM 정책 vs 버킷 정책
IAM 정책 (Identity-based):
├── "이 사용자/역할이 무엇을 할 수 있는가?"
├── IAM 사용자, 그룹, 역할에 연결
├── 여러 버킷에 대한 권한을 한 곳에서 관리
└── AWS 계정 내부 사용자에게 적합
버킷 정책 (Resource-based):
├── "이 버킷에 누가 접근할 수 있는가?"
├── S3 버킷에 직접 연결
├── 익명 사용자(퍼블릭) 액세스 허용 가능
├── 크로스 계정 액세스에 적합
└── JSON 형식으로 작성
버킷 정책 예시
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-website-bucket/*"
}
]
}
| 요소 | 설명 |
|---|---|
| Version | 정책 언어 버전 (항상 "2012-10-17" 사용) |
| Statement | 권한 규칙 배열 |
| Sid | 문장 식별자 (선택) |
| Effect | Allow 또는 Deny |
| Principal | 권한 부여 대상 (* = 모든 사용자) |
| Action | 허용/거부할 작업 |
| Resource | 적용 대상 리소스 (ARN) |
Object Ownership 설정
2023년 4월부터 새 버킷은 기본적으로 Bucket owner enforced 설정이 적용됩니다.
| 설정 | ACL 상태 | 객체 소유권 |
|---|---|---|
| Bucket owner enforced (권장) | 비활성화 | 항상 버킷 소유자 |
| Bucket owner preferred | 활성화 | bucket-owner-full-control ACL 필요 |
| Object writer (레거시) | 활성화 | 업로드한 계정 |
시험 팁
시험 포인트: 크로스 계정에서 업로드된 객체의 소유권 문제를 해결하려면 Bucket owner enforced를 사용하세요. 이 설정은 ACL을 비활성화하고 버킷 소유자가 모든 객체를 소유합니다.
S3 퍼블릭 액세스 차단
Block Public Access 설정
모든 새 버킷은 기본적으로 퍼블릭 액세스가 차단됩니다.
Block Public Access 옵션:
├── BlockPublicAcls
│ └── 퍼블릭 ACL 추가 차단
├── IgnorePublicAcls
│ └── 기존 퍼블릭 ACL 무시
├── BlockPublicPolicy
│ └── 퍼블릭 버킷 정책 차단
└── RestrictPublicBuckets
└── 퍼블릭 정책이 있는 버킷의 퍼블릭/크로스 계정 액세스 차단
| 시나리오 | 권장 설정 |
|---|---|
| 완전 프라이빗 | 4개 모두 ON (기본값) |
| 정적 웹사이트 호스팅 | 4개 모두 OFF + 버킷 정책으로 제어 |
| CloudFront 연동 | 4개 모두 ON + OAC 사용 |
퍼블릭 액세스 허용 절차
정적 웹사이트처럼 퍼블릭 액세스가 필요한 경우:
1. 계정 레벨 Block Public Access 확인
└── S3 > Block Public Access settings for this account
2. 버킷 레벨 Block Public Access 비활성화
└── 버킷 > Permissions > Block public access
3. 버킷 정책으로 퍼블릭 읽기 허용
└── Principal: "*", Action: "s3:GetObject"
S3 정적 웹사이트 호스팅
설정 방법
S3 버킷을 정적 웹사이트로 사용할 수 있습니다.
정적 웹사이트 호스팅 설정:
├── 버킷 > Properties > Static website hosting 활성화
├── Index document 지정 (예: index.html)
├── Error document 지정 (예: error.html)
├── Block Public Access 비활성화
└── 버킷 정책으로 퍼블릭 읽기 허용
웹사이트 엔드포인트
| 유형 | 형식 | 예시 |
|---|---|---|
| REST API | bucket-name.s3.region.amazonaws.com | my-bucket.s3.us-east-1.amazonaws.com |
| 웹사이트 | bucket-name.s3-website-region.amazonaws.com | my-bucket.s3-website-us-east-1.amazonaws.com |
시험 팁
시험 포인트: 정적 웹사이트 호스팅 시 HTTP만 지원합니다. HTTPS가 필요하면 CloudFront를 앞에 배치하세요. CloudFront와 연동 시 **OAC(Origin Access Control)**를 사용하여 S3 직접 접근을 차단하는 것이 보안상 권장됩니다.
S3와 CloudFront 연동
OAC vs OAI
CloudFront에서 S3 오리진에 접근할 때 사용하는 보안 메커니즘:
| 특성 | OAC (권장) | OAI (레거시) |
|---|---|---|
| 도입 시기 | 2022년 | 2008년 |
| SSE-KMS 지원 | ✅ | ❌ |
| 동적 요청 지원 | ✅ (POST, PUT 등) | ❌ (GET만) |
| 모든 리전 지원 | ✅ | ✅ |
| 권장 여부 | ✅ 권장 | 마이그레이션 권장 |
OAC 설정 흐름
OAC 설정:
1. CloudFront > Origin access control settings > Create
2. S3 버킷을 오리진으로 지정
3. CloudFront가 생성한 버킷 정책을 S3에 적용
4. S3 Block Public Access는 ON 유지
버킷 정책 예시:
{
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::account-id:distribution/distribution-id"
}
}
}]
}
S3 버전 관리
버전 관리 특성
버전 관리 상태:
├── Unversioned (기본값): 버전 관리 없음
├── Enabled: 버전 관리 활성화
└── Suspended: 버전 관리 일시 중지
주요 특성:
├── 버킷 레벨에서 활성화
├── 한번 활성화하면 비활성화 불가 (일시 중지만 가능)
├── 모든 객체 버전 보관 → 스토리지 비용 증가
└── MFA Delete로 영구 삭제 보호 가능
삭제 동작
| 작업 | 버전 관리 비활성화 | 버전 관리 활성화 |
|---|---|---|
| DELETE | 영구 삭제 | Delete Marker 추가 (복구 가능) |
| DELETE + Version ID | N/A | 특정 버전 영구 삭제 |
시험 팁
시험 포인트: 버전 관리가 활성화된 버킷에서 객체를 삭제하면 Delete Marker가 생성됩니다. 실제 데이터는 삭제되지 않으며, Delete Marker를 삭제하면 객체가 복원됩니다.
시험 출제 포인트
자주 나오는 문제 유형
| 유형 | 핵심 포인트 |
|---|---|
| 버킷 이름 | 글로벌 고유, 소문자/숫자/하이픈만, DNS 호환 |
| 객체 크기 | 최대 5TB, 100MB 이상은 멀티파트 권장 |
| 기본 보안 | 모든 버킷/객체는 기본 프라이빗 |
| 권한 관리 | IAM 정책 + 버킷 정책 조합, ACL은 레거시 |
| 크로스 계정 | 버킷 정책 또는 IAM 역할 사용 |
| 객체 소유권 | Bucket owner enforced로 소유권 문제 해결 |
| 정적 웹사이트 | HTTP만 지원, HTTPS는 CloudFront 필요 |
| CloudFront 연동 | OAC 사용 권장 (OAI는 레거시) |
오답 함정
❌ S3 버킷 이름은 리전 내에서만 고유하면 된다
→ 글로벌 고유해야 함
❌ S3 폴더에 권한을 설정할 수 있다
→ S3에는 실제 폴더가 없음, 접두사(prefix)일 뿐
❌ ACL이 버킷 정책보다 권장된다
→ 버킷 정책 + IAM 정책 조합 권장, ACL은 레거시
❌ S3 정적 웹사이트는 HTTPS를 지원한다
→ HTTP만 지원, HTTPS는 CloudFront 필요
❌ 버전 관리를 비활성화하면 이전 버전이 삭제된다
→ 버전 관리는 일시 중지만 가능, 기존 버전 유지
FAQ
Q1: S3 버킷과 객체의 차이점은 무엇인가요?
버킷은 객체를 저장하는 컨테이너(논리적 그룹)이고, 객체는 실제 데이터(파일)입니다.
- 버킷: 글로벌 고유 이름 필요, 리전에 생성, 계정당 100개 제한
- 객체: 키(경로)로 식별, 최대 5TB, 메타데이터 포함
Q2: IAM 정책과 버킷 정책 중 어떤 것을 사용해야 하나요?
동일 계정 내 사용자: IAM 정책으로 "누가 무엇을 할 수 있는지" 정의
크로스 계정 액세스 또는 퍼블릭 액세스: 버킷 정책 사용
복합 시나리오: IAM 정책 + 버킷 정책 조합 (둘 다 Allow해야 접근 가능, 하나라도 Deny면 거부)
Q3: S3 ACL은 언제 사용하나요?
거의 사용하지 않습니다. AWS는 2023년부터 새 버킷의 ACL을 기본 비활성화했습니다.
레거시 시스템 호환성이 필요하거나, CloudWatch Logs 전송 같은 AWS 서비스 연동에서 제한적으로 사용됩니다. 새로운 구현에서는 버킷 정책을 사용하세요.
Q4: S3 정적 웹사이트에서 HTTPS를 사용하려면?
S3 정적 웹사이트 호스팅 자체는 HTTP만 지원합니다. HTTPS가 필요하면:
- CloudFront 배포 생성 (S3를 오리진으로)
- ACM 인증서 연결 (CloudFront에서 HTTPS 종료)
- OAC 설정 (S3 직접 접근 차단)
이렇게 하면 사용자 → CloudFront(HTTPS) → S3(내부 통신)로 안전하게 서비스됩니다.
Q5: 다른 AWS 계정의 S3 버킷에 접근하려면?
방법 1: 버킷 정책 (리소스 기반)
{
"Principal": {"AWS": "arn:aws:iam::OTHER-ACCOUNT:root"},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket/*"
}
방법 2: IAM 역할 위임 (권장)
- 버킷 소유 계정에서 역할 생성
- 접근 계정을 신뢰 정책에 추가
- 접근 계정에서 AssumeRole로 역할 위임
역할 위임 방식이 더 세밀한 제어와 감사가 가능합니다.
마무리
S3는 AWS의 핵심 스토리지 서비스이며, SAA-C03 시험에서 다양한 형태로 출제됩니다. 핵심 포인트를 정리하면:
- 객체 스토리지: 파일 시스템이 아닌 Key-Value 구조
- 버킷: 글로벌 고유 이름, 리전에 생성
- 기본 보안: 모든 것이 프라이빗, 퍼블릭 액세스 차단 기본 ON
- 권한 관리: IAM 정책 + 버킷 정책 조합, ACL은 레거시
- 정적 웹사이트: HTTP만, HTTPS는 CloudFront 필요
다음 단계로 S3 스토리지 클래스와 S3 암호화를 학습하시면 S3 관련 내용을 완성할 수 있습니다.