SAABlog
스토리지초급

AWS S3 기초 완벽 가이드: 버킷, 객체, 권한의 모든 것

AWS S3의 핵심 개념인 버킷, 객체, 권한 관리를 초보자도 쉽게 이해할 수 있도록 상세히 설명합니다. SAA-C03 시험 대비 필수 내용 포함.

PHILOLAMB-
S3버킷객체권한스토리지IAM

관련 시험 도메인

  • 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 APIOS 마운트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문장 식별자 (선택)
EffectAllow 또는 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 APIbucket-name.s3.region.amazonaws.commy-bucket.s3.us-east-1.amazonaws.com
웹사이트bucket-name.s3-website-region.amazonaws.commy-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 IDN/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가 필요하면:

  1. CloudFront 배포 생성 (S3를 오리진으로)
  2. ACM 인증서 연결 (CloudFront에서 HTTPS 종료)
  3. 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 역할 위임 (권장)

  1. 버킷 소유 계정에서 역할 생성
  2. 접근 계정을 신뢰 정책에 추가
  3. 접근 계정에서 AssumeRole로 역할 위임

역할 위임 방식이 더 세밀한 제어와 감사가 가능합니다.


마무리

S3는 AWS의 핵심 스토리지 서비스이며, SAA-C03 시험에서 다양한 형태로 출제됩니다. 핵심 포인트를 정리하면:

  1. 객체 스토리지: 파일 시스템이 아닌 Key-Value 구조
  2. 버킷: 글로벌 고유 이름, 리전에 생성
  3. 기본 보안: 모든 것이 프라이빗, 퍼블릭 액세스 차단 기본 ON
  4. 권한 관리: IAM 정책 + 버킷 정책 조합, ACL은 레거시
  5. 정적 웹사이트: HTTP만, HTTPS는 CloudFront 필요

다음 단계로 S3 스토리지 클래스S3 암호화를 학습하시면 S3 관련 내용을 완성할 수 있습니다.