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

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

- 주소: https://copyandrun.com/blog/aws-s3-bucket-secure-defaults-console/
- 분야: 클라우드
- 발행일: 2026-10-17
- 태그: AWS, S3, 버킷 정책, 퍼블릭 액세스 차단, SSE-S3

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

저장소에 데이터를 두기 전에 네트워크 구조를 먼저 보고 싶다면 [VPC와 서브넷 글](/blog/aws-vpc-public-private-subnets-console/)을, 접근 권한을 읽는 방법은 [AWS IAM 정책 시뮬레이터 글](/blog/aws-iam-policy-simulator-read/)을 참고합니다.

## 준비물

| 항목 | 내용 |
| --- | --- |
| 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을 입력했고 버킷 유형이 범용, 네임스페이스가 글로벌로 선택된 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/01-bucket-name.png)

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

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

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

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

![객체 소유권이 ACL 비활성화됨으로 선택돼 있고 모든 퍼블릭 액세스 차단이 체크돼 아래 세부 4개 항목이 비활성 체크 상태인 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/02-ownership-public-access.png)

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

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

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

![버킷 버전 관리가 비활성화로 선택돼 있고 활성화 선택지가 함께 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/03-versioning.png)

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

![기본 암호화의 암호화 유형이 Amazon S3 관리형 키 SSE-S3로 선택돼 있고 버킷 키가 활성화로 선택된 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/04-default-encryption.png)

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

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

## 4. 버킷 만들기

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

![초록색 배너에 cr-demo-bucket-20261017 버킷이 생성됨이라는 문구가 보이고 객체가 0개인 빈 버킷 화면이 열린 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/05-created.png)

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

## 5. 권한 탭 읽기

`권한` 탭을 엽니다.

![권한 탭에서 모든 퍼블릭 액세스 차단이 활성화로 표시되고 버킷 정책은 정책이 없다는 문구와 퍼블릭 액세스가 차단된다는 안내가 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/06-permissions-tab.png)

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

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

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

```json
{
  "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 항목이 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/07-policy-editor.png)

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

![편집기 아래의 검사 표시에서 보안, 오류, 경고, 추천이 모두 0이고 변경 사항 저장 버튼이 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/07b-policy-validation.png)

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

![버킷 정책이 저장된 뒤 권한 탭에 같은 JSON이 표시되고 위쪽 배너에 버킷 정책을 편집했습니다라는 문구가 보이는 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/08-policy-saved.png)

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

## 7. 정리: 버킷 삭제

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

![버킷 삭제 화면에서 삭제 대상이 cr-demo-bucket-20261017이고 이름을 입력해야 삭제 버튼이 켜지는 것을 확인합니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/09-delete-page.png)

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

![삭제 완료 배너가 표시되고 버킷 목록에 처음부터 있던 버킷 하나만 남은 것을 확인합니다. 기존 버킷 이름은 가렸습니다.](https://copyandrun.com/img/aws-s3-bucket-secure-defaults-console/10-deleted.png)

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

## 자주 막히는 곳

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

## 이어서 해 볼 것

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

## 확인 범위

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