Amazon S3 버킷 정책은 버킷과 객체에 대한 접근 제어를 세밀하게 설정할 수 있는 핵심 보안 기능입니다. 기본적으로 S3 버킷은 외부 접근이 차단되어 있기 때문에, 웹사이트 호스팅, 특정 사용자 권한 부여, 내부 애플리케이션 접근 제어와 같은 상황에서 반드시 버킷 정책을 적절히 구성해야 합니다.
이번 글에서는 S3 버킷 정책을 작성하는 3가지 방법을 비교하고, 상황별로 어떤 방식을 선택해야 하는지 실무 관점에서 정리합니다.
📋 목차
- 3가지 방법 비교 분석
- 방법 1: 직접 JSON 작성
- 방법 2: 시각적 편집기 활용
- 방법 3: AWS Policy Generator 활용
- 상황별 추천 워크플로우
- 실무 모범 사례
3가지 방법 비교 분석
| 방법 | 장점 | 단점 | 추천 대상 | 적합한 상황 |
| 직접 JSON 작성 | • 빠른 작성 가능 • 세밀한 제어 |
• JSON 문법 숙지 필요 • 오타/구문 오류 위험 |
개발자, 숙련자 | 복잡한 정책, 빠른 수정 |
| 시각적 편집기 | • 직관적인 GUI • 실시간 JSON 미리보기 |
• 복잡한 조건 제한 • 다중 조건 설정 어려움 |
초급자, 일반 사용자 | 간단한 정책, 학습 목적 |
| Policy Generator | • 문법 오류 방지 • 단계별 가이드 제공 |
• 별도 화면에서 작성 • 일부 최신 조건 미지원 |
모든 사용자 | 정확성이 중요한 정책, 템플릿 생성 |
방법 1: 직접 JSON 작성
🖋️ 개요
SON 문법을 직접 작성하는 방식입니다. 가장 유연하고 빠르지만 문법 오류 발생 위험이 있으므로, 숙련된 개발자나 긴급 수정이 필요한 상황에서 권장됩니다.
📝 기본 구조
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PolicyIdentifier",
"Effect": "Allow|Deny",
"Principal": "* 또는 특정 ARN",
"Action": "허용 작업",
"Resource": "대상 리소스",
"Condition": {
"조건타입": {
"조건키": "조건값"
}
}
}
]
}
구성 요소 설명
- Version: "2012-10-17" (고정값)
- Statement: 정책 규칙들의 배열
- Effect: "Allow" 또는 "Deny"
- Action: 허용할 작업 (예: "s3:GetObject")
- Resource: 적용 대상 리소스 ARN
- 버킷 자체: arn:aws:s3:::버킷명
- 객체 전체: arn:aws:s3:::버킷명/*
- Principal: 접근 주체 (반드시 명시해야 함)
- * → 모든 사용자
- 특정 사용자: arn:aws:iam::계정ID:user/이름
- 특정 역할: arn:aws:iam::계정ID:role/역할명
- Condition (선택): IP 제한, HTTPS 강제, 시간 제한 등
- Sid (선택): 정책 문 단위 식별자 (관리·디버깅 목적)
🔧 실전 예제
예제 1. 웹사이트용 공개 읽기 (HTTPS 강제)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadOverTLS",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-website-bucket/*",
"Condition": {
"Bool": { "aws:SecureTransport": "true" }
}
}
]
}
⚠️ 주의: 퍼블릭 접근을 허용하려면 버킷의 ‘퍼블릭 액세스 차단(Block Public Access)’ 설정을 해제해야 정책이 적용됩니다. 보안상 권장되는 방식은 CloudFront + OAC(Origin Access Control)를 통한 공개입니다.
예제 2. 특정 사용자에게 전체 권한 부여
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "UserFullAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/developer"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-dev-bucket", // 버킷 수준
"arn:aws:s3:::my-dev-bucket/*" // 객체 수준
]
}
]
}
💡 버킷 수준(ListBucket)과 객체 수준(GetObject, PutObject 등)을 동시에 지정해야 정상적으로 동작합니다.
예제 3. 조건부 접근 제어 (보안 강화)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowReadOnlyOverTLS",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::secure-bucket/*",
"Condition": {
"Bool": { "aws:SecureTransport": "true" },
"IpAddress": { "aws:SourceIp": ["203.0.113.0/24", "198.51.100.0/24"] },
"DateGreaterThan": { "aws:CurrentTime": "2024-01-01T00:00:00Z" }
}
},
{
"Sid": "AllowUploadFromAppRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/WebAppRole"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::secure-bucket/uploads/*",
"Condition": {
"Bool": { "aws:SecureTransport": "true" }
}
}
]
}
⚠️ PutObject는 반드시 특정 IAM 사용자·역할로 제한해야 하며, 절대로 Principal: "*" 상태에서 허용하면 안 됩니다. (악성 업로드 위험)
⚡ 작성 팁 및 주의사항
- ARN 형식: arn:aws:s3:::버킷명/* (콜론 3개 주의)
- 대소문자 구분: Action, Condition 키 값은 대소문자 정확히 입력해야 함
- 배열 문법: 단일 값이라도 배열로 작성 가능 → "Action": ["s3:GetObject"]
방법 2: 시각적 편집기 활용 (Edit statement)
🎨 개요
AWS 콘솔에 내장된 GUI 기반 편집기를 활용하여 정책을 작성하는 방법입니다. 직관적인 화면을 통해 JSON 문법을 몰라도 정책을 쉽게 작성할 수 있어, 초급자나 학습용으로 적합합니다.
📋 단계별 사용 방법
1. 버킷 정책 편집 페이지에서 [ 새 명령문 추가(Add new statement) ] 버튼을 클릭합니다.


2. 시각적 편집기에서 다음 항목들을 단계별로 입력합니다.

Step 1. 기본 정보 설정
| 필드 | 예시 | 설명 |
| Sid | PublicWebsiteAccess | 정책 문 단위 식별자 (영문/숫자) |
| Effect | Allow / Deny | 권한 허용 또는 거부 선택 |
Step 2. 접근 주체(Principal) 설정
| 옵션 | 입력 형식 | 사용 사례 |
| 모든 사용자 | * | 웹사이트 공개 읽기(주의 필요) |
| 특정 AWS 계정 | arn:aws:iam::123456789012:role/PartnerAccessRole | 파트너 계정 권한 부여 |
| 특정 사용자 | arn:aws:iam::123456789012:user/app-user | 내부 개발자 전용 |
| 특정 역할 | arn:aws:iam::123456789012:role/WebAppRole | 애플리케이션 권한 위임 |
⚠️ root 계정(:root) 사용은 보안상 지양해야 하며, 반드시 Role/User ARN을 활용하는 것이 안전합니다.
Step 3. 작업(Actions) 선택
| 권한 그룹 | Actions | 용도 |
| 읽기 권한 | GetObject, GetObjectVersion | 파일 다운로드 및 메타데이터 조회 |
| 쓰기 권한 | PutObject | 파일 업로드 |
| 목록 권한 | ListBucket, ListBucketVersions | 버킷 내 파일 목록 조회 |
| 삭제 권한 | DeleteObject, DeleteObjectVersion | 객체 및 버전 삭제 |
| 전체 권한 | s3:* | 모든 S3 작업 허용 (주의) |
⚠️ *Acl 계열 액션은 ACL 비활성(Object Ownership: Bucket owner enforced) 환경에서는 불필요합니다.
Step 4. 리소스(Resources) 지정
| 패턴 | ARN 형식 | 적용 범위 |
| 버킷 자체 | arn:aws:s3:::버킷명 | ListBucket 같은 버킷 수준 작업 |
| 모든 객체 | arn:aws:s3:::버킷명/* | 버킷 내 모든 파일 접근 |
| 특정 폴더 | arn:aws:s3:::버킷명/images/* | 폴더 단위 권한 분리 |
| 특정 파일 | arn:aws:s3:::버킷명/file.jpg | 개별 객체 권한 지정 |
Step 5. 조건(Condition) 설정 (선택 사항)
| 조건 타입 | 키 | 예시 | 설명 |
| IpAddress | aws:SourceIp | 203.0.113.0/24 | 특정 IP 대역 제한 |
| Bool | aws:SecureTransport | true | HTTPS 강제 |
| StringLike | s3:prefix | user-uploads/* | ListBucket 결과 필터링 전용 |
| DateGreaterThan | aws:CurrentTime | 2024-01-01T00:00:00Z | 시간 기반 제한 |
⚠️ s3:prefix 조건은 ListBucket 액션에서만 동작합니다. GetObject/PutObject 제한은 리소스 ARN을 통해 경로별로 지정해야 합니다.
2-1. "Sid", "Principal", "Effect"을 차례대로 입력합니다.
- Sid: ObjectReadWriteAccesss
- Principal: *
- Effect: Allow

2-2. "Actions"에 GetObject, PutObject를 적용합니다.
- 우측 "작업 추가"에서 GetObject을 검색한 뒤, 선택합니다.

- 우측 "작업 추가"에서 PutObject을 검색한 뒤, 선택합니다.

2-3. "Resource"에 arn:aws:s3:::버킷명/*을 적용합니다.
버킷 내 모든 파일 접근할 수 있게 할 것입니다.
우측 "리소스 추가"에서 추가 버튼을 클릭하여, 아래와 같이 선택합니다.

2-4. 조건은 선택 사항이므로 추가하지 않겠습니다.
3. JSON 미리 보기에서 생성된 정책을 확인하고, [ 변경 사항 저장(Save changes) ] 버튼을 클릭합니다.
필요시 추가 statement를 더 생성할 수 있습니다.

4. 정책 적용이 완료됩니다.

🔍 실시간 미리 보기 활용
편집기 좌측의 JSON 미리보기 영역에서
- 설정 즉시 JSON 코드 확인 가능
- 문법 오류 실시간 감지
- 완성된 JSON 코드 복사하여 재사용 가능
방법 3: AWS Policy Generator 활용
🛠️ 개요
AWS Policy Generator는 공식적으로 제공되는 정책 생성 도구로, JSON 문법에 익숙하지 않은 사용자도 쉽게 정책을 만들 수 있습니다.
문법 오류를 방지할 수 있다는 점에서 안전하지만, 최신 조건 키나 세부 기능은 모두 지원하지 않을 수 있으므로 생성 후 반드시 검증이 필요합니다.
🔗 접근 방법
- S3 콘솔에서: 버킷 정책 편집 화면 → 정책 생성기(Policy Generator) 버튼 클릭
- 직접 접근: AWS Policy Generator
AWS Policy Generator
awspolicygen.s3.amazonaws.com
📝 단계별 사용 방법
1. 버킷 정책 편집 화면에서 [ 정책 생성기(Policy Generator) ] 버튼을 클릭합니다.

2. 새 탭에서 열린 AWS Policy Generator에서 정책을 설정합니다.

Step 1. 정책 유형 선택
- Select Type of Policy → S3 Bucket Policy 선택
Step 2. 권한 상세 설정
기본 설정
| 필드 | 값 | 설명 |
| Effect | Allow / Deny | 권한 허용/거부 |
| Principal | * 또는 ARN | 접근 주체 (*는 모든 사용자 공개 → 주의 필요, 일반적으로 IAM Role/User ARN 사용) |
Actions 선택
| 용도 | Actions |
| 읽기 전용 | GetObject |
| 업로드 전용 | PutObject |
| 업로드+읽기 | GetObject, PutObject |
| 목록 조회 | ListBucket |
| 전체 권한 | s3:* (모든 S3 작업) |
ARN 입력 예시
| 범위 | ARN 형식 | 설명 |
| 버킷 자체 | arn:aws:s3:::버킷명 | 버킷 수준 작업 |
| 모든 객체 | arn:aws:s3:::버킷명/* | 버킷 내 모든 파일 |
| 특정 폴더 | arn:aws:s3:::버킷명/folder/* | 폴더 단위 접근 제어 |
| 특정 파일 | arn:aws:s3:::버킷명/file.jpg | 개별 객체 제어 |
💡 ARN을 잘못 입력하면 정책이 적용되지 않으므로, 반드시 정확한 형식으로 작성해야 합니다.
Step 3. 조건 설정 (선택 사항)
- Generator는 제한된 조건만 제공합니다. (IP, HTTPS, Date 등)
- 복잡한 조건은 생성된 JSON을 직접 수정해야 합니다.
예시:
- IP 제한 → IpAddress: aws:SourceIp = 203.0.113.0/24
- HTTPS 강제 → Bool: aws:SecureTransport = true
- 시간 제한 → DateGreaterThan: aws:CurrentTime = 2024-01-01T09:00:00Z
3. [ Add Statement ]를 클릭하여 규칙을 추가합니다.

4. [ Generate Policy ]를 클릭하여 JSON 정책을 생성합니다.

5. 생성된 JSON을 복사합니다.

6. JSON을 S3 콘솔 정책 편집기에 붙여넣고, [ 변경 사항 저장 ] 버튼을 클릭합니다.

7. 정책 적용이 완료됩니다.

✅ Policy Generator 장점과 한계
장점
- JSON 문법 오류 방지 (완벽한 JSON 생성)
- 단계별 가이드 제공 → 초보자도 쉽게 작성 가능
- 생성된 정책을 템플릿으로 재사용 가능
한계
- 최신 IAM/S3 조건 키 일부 미지원
- 복잡한 정책은 생성 후 직접 JSON 수정 필요
정책 생성기에 대한 자세한 설명은 아래 글을 읽어보세요.
[AWS] Amazon S3 버킷 정책 생성기 사용 가이드
AWS Policy Generator는 복잡한 JSON 정책을 직접 작성하지 않고도 GUI를 통해 쉽게 AWS 정책을 생성할 수 있는 공식 도구입니다. 특히 S3 버킷 정책 생성에 매우 유용합니다. 1. AWS Policy Generator 접근 방법AW
bu119.tistory.com
상황별 추천 워크플로우
🚀 긴급 수정 (빠른 대응 필요)
- 방법 추천: 직접 JSON 작성
- 이유: 빠르게 정책을 수정할 수 있고, 복잡한 조건도 즉시 반영 가능
예시:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::urgent-bucket/*"
}
]
}
🎓 학습 목적 (정책 구조 이해)
- 방법 추천: 시각적 편집기
- 이유: JSON 문법을 몰라도 GUI로 쉽게 작성 가능, 실시간 JSON 미리보기 제공
🛡️ 프로덕션 환경 (정확성 최우선)
- 방법 추천: Policy Generator → JSON 검증 → 동료 리뷰 후 적용
- 이유: 문법 오류 방지 + 팀 내 표준화된 정책 관리 가능
📊 팀 작업 표준화
- Policy Generator로 표준 템플릿 생성
- 팀 정책 라이브러리 관리 (Git 저장소 등)
- 필요 시 직접 JSON 수정으로 커스터마이징
🔄 권장 학습 경로
| 수준 | 추천 순서 | 목적 |
| 초급자 | Policy Generator → 시각적 편집기 → 직접 JSON | 안전하게 학습, 단계적 성장 |
| 중급자 | 시각적 편집기 → 직접 JSON → Policy Generator(검증용) | 효율성과 정확성 균형 |
| 고급자 | 직접 JSON → (복잡한 경우만) Policy Generator | 최대 효율성 추구 |
실무 모범 사례
🔒 보안 기본 원칙
- 최소 권한 원칙(Principle of Least Privilege)
- 명시적 거부(Explicit Deny) 활용 → 불필요한 권한 확장 방지
- HTTPS 전송 강제 (aws:SecureTransport) → 평문 HTTP 차단
- 퍼블릭 액세스 차단(Block Public Access) 설정 확인
🏷️ 정책 관리 팁
- Sid 규칙: 작업_대상_환경 형태 권장 (예: Allow_WebApp_Read_Prod)
- 문서화: 정책에 주석은 불가능하므로, JSON 외부에 설명 파일을 반드시 관리
- 버전 관리: Git 저장소에 정책 파일 보관
💡 결론
- 초급자: Policy Generator 또는 시각적 편집기부터 시작
- 실무 운영: Policy Generator + JSON 수동 수정 + Access Analyzer 검증
- 항상 확인할 것: 최소 권한, HTTPS 강제, 퍼블릭 액세스 차단
각 방법은 고유한 장점과 적절한 사용 상황이 있습니다. 처음에는 안전한 도구를 활용해 구조를 익히고, 점차 직접 JSON 작성으로 발전하는 것을 권장합니다.
무엇보다 “보안과 정확성”을 최우선으로 두고, 상황에 맞는 방법을 선택하는 것이 S3 버킷 정책 작성의 핵심입니다.
'내맘대로 개발 일기 > DevOps' 카테고리의 다른 글
| [AWS] Amazon S3 접근을 위한 IAM 사용자 액세스 키 만들기 (0) | 2025.09.03 |
|---|---|
| [AWS] Amazon S3 사용을 위한 IAM 사용자 생성하기 (7) | 2025.09.02 |
| [AWS] Amazon S3 버킷 정책(Bucket Policy) 설정하기 (1) | 2025.08.26 |
| [AWS] Amazon S3 버킷 정책(Bucket Policy) 이해하기 (0) | 2025.08.23 |
| [AWS] Amazon S3 버킷 정책 생성기 사용 가이드 (0) | 2025.08.20 |