

# Amazon S3 버킷에 조건부 쓰기 강제 적용
<a name="conditional-writes-enforce"></a>

Amazon S3 버킷 정책을 사용하면 범용 버킷의 객체 업로드에 조건부 쓰기를 강제 적용할 수 있습니다.

버킷 정책은 Amazon S3 버킷과 그 내부의 객체에 대한 액세스 권한을 부여할 수 있는 리소스 기반 정책입니다. 버킷 소유자만 정책을 버킷에 연결할 수 있습니다. 버킷 정책에 대한 자세한 내용은 [Amazon S3의 버킷 정책](bucket-policies.md) 섹션을 참조하세요.

조건 키 `s3:if-match` 또는 `s3:if-none-match`를 선택적 `Condition` 요소 또는 `Condition` 블록을 사용하여 정책이 적용되는 시점을 지정할 수 있습니다. 멀티파트 업로드의 경우 `CreateMultipartUpload`, `UploadPart` 및 `UploadPartCopy` 작업을 제외하려면 `s3:ObjectCreationOperation` 조건 키를 지정해야 합니다. 이러한 API는 조건부 헤더를 허용하지 않기 때문입니다. 버킷 정책에서 조건을 사용하는 것에 대한 자세한 내용은 [조건 키를 사용한 버킷 정책 예시](amazon-s3-policy-keys.md) 섹션을 참조하세요.

**참고**  
버킷 정책을 사용하여 조건부 쓰기를 강제 적용하는 경우 버킷 정책에 지정된 버킷 또는 접두사에 복사 작업을 수행할 수 없습니다. `If-None-Match` 또는 `If-Match` HTTP 헤더가 없는 `CopyObject` 요청은 `403 Access Denied` 오류와 함께 실패합니다. 이러한 HTTP 헤더가 포함된 `CopyObject` 요청은 `501 Not Implemented` 응답과 함께 실패합니다.

다음 예시에서는 버킷 정책에서 조건을 사용하여 클라이언트가 `If-None-Match` 또는 `If-Match` HTTP 헤더를 사용하도록 강제하는 방법을 보여줍니다.

**Topics**
+ [예시 1: `if-none-match` 헤더를 포함하는 `PutObject` 및 `CompleteMultipartUpload` 요청만 사용하여 객체 업로드 허용](#conditional-writes-enforce-ex1)
+ [예시 2: `if-match` 헤더를 포함하는 `PutObject` 및 `CompleteMultipartUpload` 요청만 사용하여 객체 업로드 허용](#conditional-writes-enforce-ex2)
+ [예시 3: `if-none-match` 또는 `if-match` 헤더가 포함된 객체 업로드 요청만 허용](#conditional-writes-enforce-ex3)

## 예시 1: `if-none-match` 헤더를 포함하는 `PutObject` 및 `CompleteMultipartUpload` 요청만 사용하여 객체 업로드 허용
<a name="conditional-writes-enforce-ex1"></a>

이 정책은 요청에 `if-none-match` 헤더가 포함된 경우 계정 111122223333, 사용자 Alice가 *amzn-s3-demo-bucket1* 버킷에 쓸 수 있도록 허용하여 객체 키가 버킷에 이미 존재하지 않도록 합니다. 지정된 버킷에 대한 모든 `PutObject` 및 `CompleteMultipartUpload` 요청이 성공하려면 `if-none-match` 헤더가 포함되어야 합니다. 이 헤더를 사용하면 객체 키가 버킷에 없는 경우에만 이 버킷에 쓸 수 있습니다.

**참고**  
또한 이 정책은 `CreateMultipartUpload`, `UploadPart` 및 `UploadPartCopy` API를 사용하여 멀티파트 업로드를 허용하는 `s3:ObjectCreationOperation` 조건 키를 설정합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowConditionalPut",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-none-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalPutwithMPUs",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Bool": {
                    "s3:ObjectCreationOperation": "false"
                }
            }
        }
    ]
}
```

------

## 예시 2: `if-match` 헤더를 포함하는 `PutObject` 및 `CompleteMultipartUpload` 요청만 사용하여 객체 업로드 허용
<a name="conditional-writes-enforce-ex2"></a>

이 정책은 계정 111122223333, 사용자 Alice가 요청에 `if-match` 헤더가 포함된 경우에만 *amzn-s3-demo-bucket1*에 쓸 수 있도록 허용합니다. 이 헤더는 S3에 있는 객체의 ETag 값을 `WRITE` 작업 중에 제공한 값과 비교합니다. ETag 값이 일치하지 않으면 작업이 실패합니다. 지정된 버킷에 대한 모든 `PutObject` 및 `CompleteMultipartUpload` 요청이 성공하려면 `if-match` 헤더가 포함되어야 합니다.

**참고**  
또한 이 정책은 `CreateMultipartUpload`, `UploadPart` 및 `UploadPartCopy` API를 사용하여 멀티파트 업로드를 허용하는 `s3:ObjectCreationOperation` 조건 키를 설정합니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowPutObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
        },
        {
            "Sid": "BlockNonConditionalObjectCreation",
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "true"
                },
                "Bool": {
                    "s3:ObjectCreationOperation": "true"
                }
            }
        },
        {
            "Sid": "AllowGetObjectBecauseConditionalPutIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

## 예시 3: `if-none-match` 또는 `if-match` 헤더가 포함된 객체 업로드 요청만 허용
<a name="conditional-writes-enforce-ex3"></a>

이 정책은 요청에 `if-none-match` 또는 `if-match` 헤더가 포함된 경우 계정 111122223333, 사용자 Alice가 *amzn-s3-demo-bucket1*에 쓸 수 있도록 허용합니다. 이렇게 하면 키 이름이 버킷에 존재하지 않을 경우 Alice가 객체를 업로드할 수 있습니다. 또는 키 이름이 존재할 경우 객체 ETag가 `PUT` 요청에 제공된 ETag와 일치하면 Alice가 객체를 덮어쓸 수 있습니다.

**참고**  
또한 이 정책은 `CreateMultipartUpload`, `UploadPart` 및 `UploadPartCopy` API를 사용하여 멀티파트 업로드를 허용하는 `s3:ObjectCreationOperation` 조건 키를 설정합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": " AllowConditionalPutifAbsent",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-none-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalPutIfMatchEtag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Null": {
                    "s3:if-match": "false"
                }
            }
        },
        {
            "Sid": "AllowConditionalObjectCreation",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*",
            "Condition": {
                "Bool": {
                    "s3:ObjectCreationOperation": "false"
                }
            }
        },
        {
            "Sid": " AllowGetObjectBecauseConditionalPutIfMatchETag",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Alice"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*"
        }
    ]
}
```

------