Copy & Run

AWS 콘솔에서 S3 버킷을 기본 보안 설정으로 만들고 HTTPS 전용 정책 붙이기

버킷 만들기 화면의 기본값(ACL 비활성, 모든 퍼블릭 액세스 차단, SSE-S3 암호화, 버전 관리 비활성)을 하나씩 읽고 버킷을 만듭니다. 복사해 붙여 넣는 버킷 정책으로 HTTPS가 아닌 요청을 거부하게 하고, 실습 뒤 버킷을 삭제합니다.

실습 노트 · 2026-10-17 발행 · 7분 · 2026-10 확인

S3 버킷을 만들 때 화면에 미리 채워져 있는 기본값이 어떤 보안 의미를 갖는지 읽고, 그 값 그대로 버킷을 만듭니다. 이어서 JSON 한 덩어리를 복사해 붙여 넣어 HTTPS가 아닌 요청을 막는 버킷 정책을 적용하고, 마지막에 버킷을 지웁니다.

저장소에 데이터를 두기 전에 네트워크 구조를 먼저 보고 싶다면 VPC와 서브넷 글을, 접근 권한을 읽는 방법은 AWS IAM 정책 시뮬레이터 글을 참고합니다.

준비물

항목 내용
AWS 계정 실습용 IAM 사용자. S3 버킷 생성, 정책 편집, 삭제 권한 필요
리전 아시아 태평양(서울) ap-northeast-2
버킷 이름 cr-demo-bucket-20261017. 이름은 글로벌 네임스페이스에서 유일해야 합니다. 날짜만 붙이면 겹치거나 추측될 수 있으니 임의의 문자열(예: 무작위 6자리)을 덧붙이고, 이미 사용 중이라는 오류가 나면 다른 이름으로 바꿉니다
브라우저 Chrome, AWS 콘솔 한국어 화면
예상 소요 시간 약 15분

이 글은 만든 버킷에 객체를 올리지 않았고, 마지막에 버킷을 삭제했습니다. 같은 계정에 있던 다른 버킷은 건드리지 않았습니다. 화면의 계정 정보와 기존 버킷 이름은 가렸습니다.

1. 일반 구성: 이름 입력

S3 콘솔에서 버킷 만들기를 엽니다. 일반 구성은 아래처럼 기본값이 잡혀 있습니다.

화면 항목 이 글의 값
AWS 리전 아시아 태평양(서울) ap-northeast-2
버킷 유형 범용 (기본 선택)
버킷 네임스페이스 글로벌 네임스페이스 (기본 선택)
버킷 이름 cr-demo-bucket-20261017

버킷 이름 칸에 cr-demo-bucket-20261017을 입력했고 버킷 유형이 범용, 네임스페이스가 글로벌로 선택된 것을 확인합니다.
버킷 이름 칸에 cr-demo-bucket-20261017을 입력했고 버킷 유형이 범용, 네임스페이스가 글로벌로 선택된 것을 확인합니다.

이름 칸 아래 안내문은 3~63자, 소문자와 숫자와 마침표와 하이픈만 쓸 수 있고 문자나 숫자로 시작하고 끝나야 하며 글로벌 네임스페이스에서 유일해야 한다고 알려 줍니다. 같은 화면에 계정 리전 네임스페이스(권장) 선택지도 보이지만, 이 글은 기본값인 글로벌 네임스페이스를 썼습니다. 같은 이름이 이미 있으면 만들 수 없으니 뒤에 날짜나 임의의 숫자를 붙입니다.

2. 객체 소유권과 퍼블릭 액세스 차단

아래로 내리면 보안과 직접 관련된 두 구역이 있습니다. 둘 다 이 글에서는 기본값을 그대로 둡니다.

구역 기본값 의미
객체 소유권 ACL 비활성화됨(권장) 버킷의 모든 객체를 이 계정이 소유하고, 접근 권한은 정책으로만 정합니다
모든 퍼블릭 액세스 차단 체크됨 아래 4개 세부 항목(새 ACL, 임의의 ACL, 새 퍼블릭 정책, 임의의 퍼블릭 정책)을 모두 켠 것과 같습니다

객체 소유권이 ACL 비활성화됨으로 선택돼 있고 모든 퍼블릭 액세스 차단이 체크돼 아래 세부 4개 항목이 비활성 체크 상태인 것을 확인합니다.
객체 소유권이 ACL 비활성화됨으로 선택돼 있고 모든 퍼블릭 액세스 차단이 체크돼 아래 세부 4개 항목이 비활성 체크 상태인 것을 확인합니다.

화면 설명은 AWS에서 모든 퍼블릭 액세스 차단을 켜 두도록 권장한다고 안내합니다. 퍼블릭 액세스가 꼭 필요한 용도가 아니라면 이 체크를 풀지 않습니다.

3. 버전 관리와 기본 암호화

더 아래에는 버킷 버전 관리와 기본 암호화가 있습니다.

버킷 버전 관리가 비활성화로 선택돼 있고 활성화 선택지가 함께 보이는 것을 확인합니다.
버킷 버전 관리가 비활성화로 선택돼 있고 활성화 선택지가 함께 보이는 것을 확인합니다.

버전 관리는 기본이 비활성화입니다. 객체를 덮어쓰거나 지워도 이전 버전이 필요하다면 활성화합니다. 이 글은 객체를 올리지 않으므로 기본값을 유지했습니다.

기본 암호화의 암호화 유형이 Amazon S3 관리형 키 SSE-S3로 선택돼 있고 버킷 키가 활성화로 선택된 것을 확인합니다.
기본 암호화의 암호화 유형이 Amazon S3 관리형 키 SSE-S3로 선택돼 있고 버킷 키가 활성화로 선택된 것을 확인합니다.

항목 기본값
암호화 유형 Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화
버킷 키 활성화

화면은 서버 측 암호화가 이 버킷에 저장되는 새 객체에 자동으로 적용된다고 설명합니다. KMS 키로 직접 관리하려면 SSE-KMS를 고르고, 그 경우 KMS 요금이 따로 있다는 안내가 화면에 있습니다. 이 글에서는 SSE-S3를 그대로 씁니다.

4. 버킷 만들기

맨 아래 고급 설정은 열지 않고 버킷 만들기를 누릅니다.

초록색 배너에 cr-demo-bucket-20261017 버킷이 생성됨이라는 문구가 보이고 객체가 0개인 빈 버킷 화면이 열린 것을 확인합니다.
초록색 배너에 cr-demo-bucket-20261017 버킷이 생성됨이라는 문구가 보이고 객체가 0개인 빈 버킷 화면이 열린 것을 확인합니다.

배너에 생성됨이 표시되고 버킷의 객체 탭이 비어 있는 상태로 열립니다.

5. 권한 탭 읽기

권한 탭을 엽니다.

권한 탭에서 모든 퍼블릭 액세스 차단이 활성화로 표시되고 버킷 정책은 정책이 없다는 문구와 퍼블릭 액세스가 차단된다는 안내가 보이는 것을 확인합니다.
권한 탭에서 모든 퍼블릭 액세스 차단이 활성화로 표시되고 버킷 정책은 정책이 없다는 문구와 퍼블릭 액세스가 차단된다는 안내가 보이는 것을 확인합니다.

퍼블릭 액세스 차단(버킷 설정)이 활성화이고, 버킷 정책에는 표시할 정책이 없습니다. 아래에는 이 버킷에 퍼블릭 액세스 차단이 켜져 있어 퍼블릭 액세스가 차단된다는 안내 상자가 있습니다. 여기까지가 기본값만으로 만든 버킷의 상태입니다.

6. HTTPS가 아닌 요청을 거부하는 버킷 정책

버킷 정책의 편집을 열고, 아래 JSON을 복사해 편집기에 붙여 넣습니다. 버킷 이름 부분(cr-demo-bucket-20261017)은 본인의 버킷 이름으로 바꿉니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyInsecureTransport",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::cr-demo-bucket-20261017",
        "arn:aws:s3:::cr-demo-bucket-20261017/*"
      ],
      "Condition": {
        "Bool": { "aws:SecureTransport": "false" }
      }
    }
  ]
}
줄 의미
"Effect": "Deny" 조건에 맞으면 거부
"Principal": "*" 누가 요청하든
"Action": "s3:*" 모든 S3 작업
"Resource" 버킷 자체와 그 안의 모든 객체
"aws:SecureTransport": "false" 요청이 HTTPS가 아닐 때

정책 편집기에 18줄의 JSON이 붙여 넣어져 Sid, Effect, Resource, Condition 항목이 보이는 것을 확인합니다.
정책 편집기에 18줄의 JSON이 붙여 넣어져 Sid, Effect, Resource, Condition 항목이 보이는 것을 확인합니다.

편집기에 붙여 넣으면 자동 들여쓰기로 줄 모양이 조금 달라질 수 있지만 JSON으로는 같습니다. 아래로 내려 검사 표시(보안, 오류, 경고, 추천)가 모두 0인 것을 확인하고 변경 사항 저장을 누릅니다.

편집기 아래의 검사 표시에서 보안, 오류, 경고, 추천이 모두 0이고 변경 사항 저장 버튼이 보이는 것을 확인합니다.
편집기 아래의 검사 표시에서 보안, 오류, 경고, 추천이 모두 0이고 변경 사항 저장 버튼이 보이는 것을 확인합니다.

이 정책은 접근을 허용하는 문장이 아니라 거부하는 문장이라서, 퍼블릭 액세스 차단이 켜진 상태에서도 저장이 막히지 않았습니다. 또 Principal이 *이므로 HTTP로 들어오는 요청은 버킷 소유자의 요청도 막습니다. AWS 콘솔과 SDK는 기본적으로 HTTPS를 쓰므로 이 실습에서는 영향이 없었습니다. 구조는 AWS 공식 문서의 버킷 정책 예제(HTTPS 요청만 허용)와 같습니다.

버킷 정책이 저장된 뒤 권한 탭에 같은 JSON이 표시되고 위쪽 배너에 버킷 정책을 편집했습니다라는 문구가 보이는 것을 확인합니다.
버킷 정책이 저장된 뒤 권한 탭에 같은 JSON이 표시되고 위쪽 배너에 버킷 정책을 편집했습니다라는 문구가 보이는 것을 확인합니다.

저장하면 배너에 버킷 정책을 편집했습니다.가 표시되고 권한 탭의 버킷 정책 칸에 같은 JSON이 보입니다.

7. 정리: 버킷 삭제

버킷 목록에서 만든 버킷 하나만 선택하고 삭제를 누릅니다.

버킷 삭제 화면에서 삭제 대상이 cr-demo-bucket-20261017이고 이름을 입력해야 삭제 버튼이 켜지는 것을 확인합니다.
버킷 삭제 화면에서 삭제 대상이 cr-demo-bucket-20261017이고 이름을 입력해야 삭제 버튼이 켜지는 것을 확인합니다.

화면은 버킷 삭제를 되돌릴 수 없고, 삭제한 이름을 다른 AWS 사용자가 쓸 수 있다고 경고합니다. 이 글의 버킷은 실습용 빈 버킷이라 삭제했지만, 운영 중인 글로벌 네임스페이스 버킷은 같은 이름을 다른 계정이 가져갈 수 있으니 함부로 지우지 않습니다. 확인 칸에 버킷 이름을 그대로 입력하면 버킷 삭제가 켜집니다.

삭제 완료 배너가 표시되고 버킷 목록에 처음부터 있던 버킷 하나만 남은 것을 확인합니다. 기존 버킷 이름은 가렸습니다.
삭제 완료 배너가 표시되고 버킷 목록에 처음부터 있던 버킷 하나만 남은 것을 확인합니다. 기존 버킷 이름은 가렸습니다.

목록에는 처음부터 있던 버킷 하나만 남았습니다.

자주 막히는 곳

증상 확인할 것
정책 편집기에 붙여 넣은 JSON이 다르게 들여써짐 편집기가 자동으로 들여쓰기를 바꾸는 것이며 이 글에서는 그대로 저장돼도 문제가 없었습니다
같은 계정에 다른 버킷이 이미 있음 삭제 전 목록에서 내가 만든 버킷만 선택돼 있는지, 삭제 화면의 버킷 이름이 맞는지 확인합니다

이어서 해 볼 것

  • 버전 관리를 활성화하고 객체를 올려 지우기 전후의 버전 보기
  • SSE-KMS로 바꾸고 KMS 키 정책 확인하기
  • CloudTrail 데이터 이벤트로 버킷 접근 기록 확인하기

확인 범위

  • 확인한 것: 서울 리전 콘솔(한국어 화면)에서 위 기본값으로 버킷을 만들고, 정책을 저장하고, 버킷을 삭제하는 과정을 실제로 수행했습니다. 정책 편집기의 검사 결과는 모두 0이었습니다.
  • 확인하지 못한 것: 저장한 정책이 HTTP 요청을 실제로 거부하는지는 객체를 올려 요청해 보지 않았습니다. aws:SecureTransport 조건은 AWS 공식 문서의 예제(https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)와 같은 구조임을 확인했지만, 실제 HTTP 요청이 거부되는 동작은 시험하지 않았습니다. 고급 설정(객체 잠금)과 버전 관리 활성화 상태는 열어 보지 않았습니다.
  • 화면 구성과 기본값은 콘솔 업데이트에 따라 달라질 수 있습니다.

이 글의 다음 단계

클라우드 보안 실무 과정의 일부입니다

이 실습은 교육에서 참가자마다 독립된 환경으로 진행합니다. 원하는 일정을 고르면 문의 양식에 미리 채워집니다.

과정 보기

교육 진행 순서와 자주 묻는 질문 보기

같은 카테고리의 글