Amazon S3는 데이터 저장 자체보다 보안 설정이 훨씬 중요 시험에서도 세부 옵션 차이를 자주 묻는 영역
🔐 Amazon S3 – Object Encryption
S3 객체는 4가지 방식으로 암호화 가능
암호화 방식 분류
- Server-Side Encryption (SSE)
- SSE-S3
- SSE-KMS
- SSE-C
- Client-Side Encryption
👉 _어떤 상황에 어떤 암호화 방식을 쓰는지_가 핵심
🟦 SSE-S3 (S3 Managed Keys)
AWS가 키를 전부 관리
특징
-
암호화 알고리즘: AES-256
-
객체는 서버 측에서 암호화
-
요청 시 헤더:
x-amz-server-side-encryption: AES256 -
신규 버킷 & 신규 객체에 기본 활성화
-
키 관리 부담 ❌
-
감사(Audit) 제어 ❌
User
→ HTTP(S) +Header
→ S3 Bucket
→ S3Owned Key로 암호화
🟨 SSE-KMS (AWS KMS Keys)
AWS KMS를 이용한 키 관리
특징
-
암호화 키:
- AWS Managed KMS Key
- Customer Managed KMS Key
-
요청 시 헤더:
x-amz-server-side-encryption:aws:kms -
CloudTrail을 통한 키 사용 감사 가능
-
사용자 제어 가능 (Key Policy)
User
→HTTP(S) +Header
→ S3 Bucket
→ KMS Key
→ 암호화
⚠️ SSE-KMS 제한 사항 (중요)
KMS API 호출 제한에 영향 받음
KMS API 호출
- 업로드 시:
GenerateDataKey
- 다운로드 시:
Decrypt
KMS 요청 제한
- Region별 초당 요청 제한:
- 5,500
- 10,000
- 30,000 req/s
- Service Quotas에서 증설 요청 가능
🟥 SSE-C (Customer-Provided Keys)
고객이 키를 직접 관리
특징
- AWS는 암호화 키를 저장하지 않음
- 모든 요청에 암호화 키를 HTTP Header로 전달
- HTTPS 필수
- 키 분실 시 데이터 복구 ❌
User
→ HTTPS + KeyHeader
→ S3 Bucket
→Object 암호화
🧑💻 Client-Side Encryption
S3에 업로드 전에 클라이언트에서 직접 암호화
특징
- S3 Client-Side Encryption Library 사용
- 암호화/복호화:
- 모두 클라이언트 책임
- AWS는 암호화 관여 ❌
Client
→ 파일 암호화
→ S3 업로드
→ 암호화된 객체 저장
🔒 Encryption in Transit (전송 중 암호화)
SSL / TLS 기반 암호화
S3 엔드포인트
- ❌ HTTP (비암호화)
- ✅ HTTPS (암호화)
중요 포인트
- HTTPS 사용 권장
- SSE-C는 HTTPS 필수
- 대부분의 SDK / 콘솔은 HTTPS 기본 사용
🚫 Force Encryption in Transit
HTTP 접근을 강제로 차단
aws:SecureTransport 조건 사용
- HTTP 요청 → Deny
- HTTPS 요청 → Allow
"Condition":{
"Bool":{
"aws:SecureTransport":"false"
}
}❌ HTTP 접근 차단
✅ HTTPS 접근만 허용
🔁 Default Encryption vs Bucket Policy
Default Encryption
- SSE-S3 자동 적용
- 신규 객체에만 적용
Bucket Policy로 강제 암호화
- 암호화 헤더 없는 PUT 요청 거부
- SSE-KMS / SSE-C 강제 가능
⚠️ 중요 규칙
Bucket Policy는 Default Encryption보다 먼저 평가됨
🌍 CORS (Cross-Origin Resource Sharing)
브라우저 기반 보안 메커니즘
Origin 정의
Protocol + Domain + Port
예:
https://www.example.com
Same Origin
http://example.com/app1http://example.com/app2
Cross Origin
http://www.example.comhttp://other.example.com
🔄 CORS 동작 흐름
- 브라우저 → Preflight 요청 (OPTIONS)
- 서버 → 허용 헤더 반환
- 허용 시 실제 요청 수행
주요 헤더
Access-Control-Allow-OriginAccess-Control-Allow-Methods
🪣 Amazon S3 – CORS 설정 (⭐)
정적 웹사이트 + 리소스 분리 구조에서 자주 등장
HTML Bucket (Website)
→ 이미지 요청
→ Asset Bucket
- S3 Bucket에 CORS 설정 필수
- Origin:
- 특정 도메인
- 또는
🧱 S3 MFA Delete
중요 삭제 작업에 MFA 요구
MFA 필요 작업
- 객체 버전 영구 삭제
- Versioning 중단
MFA 불필요 작업
- Versioning 활성화
- 삭제된 버전 목록 조회
제약 사항
- Versioning 필수
- Root Account만 설정 가능
📑 S3 Access Logs
모든 S3 접근 기록 로깅
특징
- 모든 요청 기록
- 허용 / 거부 포함
- 대상:
- 다른 S3 Bucket
- 동일 Region 필수
- 분석 도구와 연계 가능
⚠️ Access Logs 주의사항
로깅 버킷 = 모니터링 버킷 ❌
- 로그 무한 루프 발생
- 버킷 용량 폭증 위험
🔗 S3 Pre-Signed URLs
임시 접근 URL 발급
생성 방법
- S3 Console
- AWS CLI
- SDK
만료 시간
- Console: 1분 ~ 12시간
- CLI: 기본 1시간, 최대 7일
특징
- URL 사용자는
- URL 생성자의 권한을 상속
- GET / PUT 모두 가능
사용 사례
- 로그인 사용자만 파일 다운로드
- 임시 업로드 허용
- 유저 목록이 수시로 바뀌는 경우
🧊 S3 Glacier Vault Lock
WORM (Write Once Read Many)
특징
- Vault Lock Policy 생성
- 정책 영구 고정
- 삭제/수정 ❌
- 컴플라이언스 / 보존 규정 대응
🔒 S3 Object Lock
객체 단위 WORM (Versioning 필수)
Retention Mode
Compliance
- 누구도 삭제/수정 ❌
- Root 포함
- 기간 단축 ❌
Governance
- 특정 권한 사용자는 변경 가능
보호 방식
- Retention Period
- Legal Hold
- 무기한 보호
s3:PutObjectLegalHold필요
🎯 S3 Access Points
대규모 버킷 접근 제어 단순화
특징
- Access Point마다:
- 고유 DNS
- 개별 Policy
- Prefix 단위 권한 관리 가능
/finance → FinanceAccessPoint
/sales → SalesAccessPoint
🏢 Access Points – VPC Origin
VPC 내부 접근만 허용
요구 조건
- VPC Endpoint 필요
- Gateway / Interface
- 정책 3중 구조
- VPC Endpoint Policy
- Access Point Policy
- Bucket Policy
🧠 S3 Object Lambda
객체 반환 시 Lambda로 실시간 변환
구조
Application
→ S3Object LambdaAccessPoint
→ LambdaFunction
→ 원본 S3Object
사용 사례
- 개인정보 마스킹
- XML → JSON 변환
- 이미지 리사이즈 / 워터마크
- 사용자별 응답 변형
🧾 S3 Security 요약
- SSE-S3 = 기본
- SSE-KMS = 감사/제어 필요 시
- SSE-C = 고객 키 직접 관리
- HTTPS 강제 =
aws:SecureTransport - Bucket Policy > Default Encryption
- CORS = 브라우저 문제
- MFA Delete = Root만 설정
- Pre-Signed URL = 임시 권한 위임
- Object Lock / Vault Lock = 컴플라이언스
- Access Point = 대규모 권한 관리
- Object Lambda = 동적 데이터 가공