AWS Policy Generator는 복잡한 JSON 정책을 직접 작성하지 않고도 GUI를 통해 쉽게 AWS 정책을 생성할 수 있는 공식 도구입니다. 특히 S3 버킷 정책 생성에 매우 유용합니다.
1. AWS Policy Generator 접근 방법
AWS Policy Generator는 https://awspolicygen.s3.amazonaws.com/policygen.html에서 접근할 수 있으며, AWS 콘솔 로그인 없이도 사용 가능합니다.
2. 정책 생성기 구성 요소 설명

1️⃣ Step 1: 정책 유형 선택 (Select Policy Type)

Type of Policy (정책 유형)
정책 생성기에서 지원하는 정책 유형들과 각각의 사용 목적:
1. S3 Bucket Policy
- 용도: S3 버킷과 객체에 대한 접근 권한 제어
- 적용 대상: 특정 S3 버킷
- 주요 사용 사례:
- 정적 웹사이트 퍼블릭 액세스
- 특정 사용자/역할에게만 버킷 접근 허용
- CloudFront와 연동한 원본 버킷 보안
2. IAM Policy
- 용도: 사용자, 그룹, 역할에 부여할 권한 정책
- 적용 대상: IAM 엔터티
- 주요 사용 사례:
- 개발팀별 리소스 접근 권한 분리
- 최소 권한 원칙 적용
3. SNS Topic Policy
- 용도: SNS 주제에 대한 구독/발행 권한
- 적용 대상: SNS 주제
- 주요 사용 사례:
- 다른 AWS 계정과 알림 공유
- 애플리케이션 간 메시징
4. SQS Queue Policy
- 용도: SQS 대기열 접근 권한
- 적용 대상: SQS 대기열
- 주요 사용 사례:
- 서비스 간 비동기 통신 권한 관리
5. VPC Endpoint Policy
- 용도: VPC 엔드포인트를 통한 서비스 접근 제어
- 적용 대상: VPC 엔드포인트
- 주요 사용 사례:
- 프라이빗 네트워크에서 AWS 서비스 접근 제어
2️⃣ Step 2: 정책 명령문 구성 (Add Statements)

Effect (효과)
정책의 기본 동작을 결정하는 핵심 요소:
1. Allow (허용)
"Effect": "Allow"
- 명시적으로 작업을 허용
- 기본적으로 모든 작업이 거부되므로 필요한 작업만 허용
- 사용 예시: 읽기 전용 액세스, 특정 폴더 업로드 권한
2. Deny (거부)
"Effect": "Deny"
- 명시적으로 작업을 거부
- Allow보다 우선순위가 높음
- 사용 예시: 특정 IP 차단, 삭제 작업 금지, 민감한 폴더 접근 차단
Principal (보안 주체)
정책이 적용될 대상을 지정하는 중요한 필드:
1. 모든 사용자 (퍼블릭 액세스)
"Principal": "*"
- 주의사항: 인터넷의 모든 사용자가 접근 가능
- 사용 사례: 정적 웹사이트, 공개 다운로드 파일
2. 특정 AWS 계정
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
}
- 사용 사례: 다른 AWS 계정과 리소스 공유
3. 특정 IAM 사용자
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/username"
}
4. 특정 IAM 역할
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/rolename"
}
5. AWS 서비스
"Principal": {
"Service": "cloudfront.amazonaws.com"
}
Actions (작업)
S3에서 수행할 수 있는 주요 작업들:
1. 객체 관련 작업
- s3:GetObject: 객체 읽기/다운로드
- s3:PutObject: 객체 업로드/생성
- s3:DeleteObject: 객체 삭제
- s3:GetObjectAcl: 객체 ACL 조회
- s3:PutObjectAcl: 객체 ACL 설정
2. 버킷 관련 작업
- s3:ListBucket: 버킷 내용 목록 조회
- s3:GetBucketLocation: 버킷 위치 정보 조회
- s3:GetBucketVersioning: 버킷 버전 관리 상태 조회
3. 와일드카드 사용
- s3:Get*: 모든 읽기 작업
- s3:Put*: 모든 쓰기 작업
- s3:*: 모든 S3 작업
Amazon Resource Name (ARN)
정책이 적용될 리소스를 정확히 지정:
1. 버킷 자체
arn:aws:s3:::my-bucket
- 버킷 속성 관련 작업에 사용 (ListBucket 등)
2. 버킷 내 모든 객체
arn:aws:s3:::my-bucket/*
- 객체 관련 작업에 사용 (GetObject, PutObject 등)
3. 특정 경로의 객체
arn:aws:s3:::my-bucket/uploads/*
arn:aws:s3:::my-bucket/public/images/*
4. 복수 리소스 지정
arn:aws:s3:::my-bucket
arn:aws:s3:::my-bucket/*
조건 추가 (Add Conditions) - 선택사항
조건을 통해 더욱 세밀한 접근 제어가 가능합니다. Policy Generator에서는 세 개의 필드로 조건을 설정합니다:

조건 설정 구성 요소
1. Condition (조건 연산자)
- StringEquals: 문자열 정확 일치
- StringLike: 와일드카드 패턴 매칭
- IpAddress: IP 주소 범위 내
- DateGreaterThan: 지정 날짜 이후
- Bool: 불린 값 (true/false)
- NumericLessThan: 지정 값보다 작음
2. Key (조건 키)
- aws:CurrentTime: 현재 시간
- aws:SourceIp: 요청자 IP 주소
- aws:SecureTransport: HTTPS 사용 여부
- s3:x-amz-server-side-encryption: S3 암호화 방식
3. Value (조건 값)
- 조건과 비교할 실제 값 입력
- 복수 값은 쉼표로 구분
주요 조건 활용 예시
예시 1: IP 주소 기반 제어
- Condition: IpAddress
- Key: aws:SourceIp
- Value: 192.168.1.0/24,203.0.113.0/24
"Condition": {
"IpAddress": {
"aws:SourceIp": ["192.168.1.0/24", "203.0.113.0/24"]
}
}
예시 2: 시간 기반 제어
- Condition: DateGreaterThan
- Key: aws:CurrentTime
- Value: 2024-01-01T00:00:00Z
"Condition": {
"DateGreaterThan": {
"aws:CurrentTime": "2024-01-01T00:00:00Z"
}
}
예시 3: HTTPS 연결만 허용
- Condition: Bool
- Key: aws:SecureTransport
- Value: true
"Condition": {
"Bool": {
"aws:SecureTransport": "true"
}
}
예시 4: 특정 암호화 요구
- Condition: StringEquals
- Key: s3:x-amz-server-side-encryption
- Value: AES256
"Condition": {
"StringEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
3. 실용적인 정책 예시
1. 정적 웹사이트 호스팅 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-website-bucket/*"
}
]
}
2. CloudFront OAC (Origin Access Control) 정책 - 권장
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-private-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE"
}
}
}
]
}
3. CloudFront OAI (Origin Access Identity) 정책 - 레거시
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E123456789"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-private-bucket/*"
}
]
}
참고: OAI는 더 이상 권장되지 않으며, OAC(Origin Access Control) 사용을 권장합니다.
4. 개발팀 전용 업로드 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/DeveloperRole"
},
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::dev-bucket/uploads/*"
}
]
}
5. 읽기 전용 + IP 제한 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::secure-bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "203.0.113.0/24"
}
}
}
]
}
6. 멀티파트 업로드 지원 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/UploadRole"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": "arn:aws:s3:::upload-bucket/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/UploadRole"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::upload-bucket"
}
]
}
4. 정책 생성 및 적용 과정
- 정책 생성: "Generate Policy" 버튼 클릭
- JSON 복사: 생성된 정책 JSON을 복사
- S3 콘솔 이동: AWS S3 콘솔로 이동
- 버킷 선택: 정책을 적용할 버킷 선택
- 권한 탭: "Permissions" 탭 클릭
- 버킷 정책: "Bucket Policy" 섹션에서 "Edit" 클릭
- 정책 붙여넣기: 생성한 JSON 정책 붙여넣기
- 저장: "Save changes" 클릭
5. 보안 모범 사례
1. 최소 권한 원칙
- 꼭 필요한 권한만 부여
- 와일드카드(*) 사용 최소화
- 정기적인 권한 검토
2. Principal 설정 주의사항
- "Principal": "*"는 신중히 사용
- 특정 계정이나 역할로 제한 권장
- 서비스 간 통신에는 역할 기반 접근
3. 조건 활용
- IP 주소 제한으로 보안 강화
- SSL/HTTPS 강제로 데이터 보호
- 시간 기반 접근 제어로 임시 권한 부여
4. 정책 테스트
- AWS IAM Policy Simulator로 사전 테스트
- 단계적 적용으로 영향도 확인
- CloudTrail 로그 모니터링으로 정책 효과 검증
5. 버킷 퍼블릭 액세스 설정
- S3 버킷의 "Block Public Access" 설정과 정책이 상충되지 않도록 주의
- 퍼블릭 정책 적용 시 해당 설정 해제 필요
6. 문제 해결
1. 접근 거부 오류 (Access Denied)
- 버킷 퍼블릭 액세스 차단 설정 확인: 버킷 레벨의 "Block Public Access" 설정
- 정책 구문 오류 검사: JSON 형식 및 구문 확인
- ARN 형식 정확성 확인: 버킷명, 경로 등 정확성 검증
- Principal과 Actions 일치 여부 확인: 권한 주체와 작업의 논리적 일치성
2. 정책 적용 안 됨
- 정책 저장 후 전파 대기: 정책 변경 사항 전파에 수 분 소요
- CloudFront 캐시 무효화: CDN 캐시로 인한 이전 정책 적용
- 브라우저 캐시 삭제: 클라이언트 측 캐시 문제
3. 조건부 정책 작동 안 함
- 조건 키 정확성 확인: AWS에서 지원하는 조건 키인지 확인
- 대소문자 구분: 조건 연산자와 값의 대소문자 정확성
- 데이터 타입 일치: 문자열, 숫자, 불린 등 데이터 타입 정확성
7. 고급 사용 팁
1. 다중 명령문(Statement) 활용
하나의 정책에 여러 명령문을 포함하여 복잡한 권한 구조 구현 가능
2. 정책 크기 제한
- 버킷 정책 최대 크기: 20KB
- 복잡한 정책의 경우 IAM 정책 분할 고려
3. 정책 버전 관리
- "Version": "2012-10-17" 사용 권장
- 이전 버전 사용 시 일부 기능 제한 가능
4. 조건 연산자 활용
- StringLike, StringNotLike: 와일드카드 패턴 매칭
- NumericLessThan, NumericGreaterThan: 숫자 범위 조건
- DateLessThan, DateGreaterThan: 시간 범위 조건
AWS Policy Generator를 활용하면 복잡한 S3 버킷 정책도 GUI를 통해 쉽게 생성할 수 있으며, 다양한 보안 요구사항을 효과적으로 구현할 수 있습니다. 정책 생성 후에는 반드시 테스트를 통해 의도한 대로 작동하는지 확인하는 것이 중요합니다.
'내맘대로 개발 일기 > 뽀모로 Do!' 카테고리의 다른 글
| [AWS] Amazon S3 버킷 정책(Bucket Policy) 작성 방법 (3가지) (7) | 2025.09.01 |
|---|---|
| [AWS] Amazon S3 버킷 정책(Bucket Policy) 설정하기 (1) | 2025.08.26 |
| [AWS] Amazon S3 Bucket 생성하기 (3) | 2025.08.13 |
| [인프라 구축] AWS Lightsail 서버에 가비아 도메인 연결하기 - 2025년 최신 가이드 (3) | 2025.08.12 |
| [AWS] MySQL Workbench로 Lightsail DB에 접속하기 (2) | 2025.08.07 |