

# 조건 키를 사용한 버킷 정책 예시
<a name="amazon-s3-policy-keys"></a>

권한 부여 시 액세스 정책 언어를 사용하여 조건을 지정할 수 있습니다. 선택적 `Condition` 요소 또는 `Condition` 블록을 사용하여 정책이 적용되는 시기에 대한 조건을 지정할 수 있습니다.

객체 및 버킷 작업에 Amazon S3 조건 키를 사용하는 정책은 다음 예제를 참조하십시오. 조건 키에 대한 자세한 내용은 [Amazon S3의 정책 조건 키](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-conditionkeys) 섹션을 참조하십시오. 정책에 지정할 수 있는 Amazon S3 작업, 조건 키, 리소스의 전체 목록은 **서비스 승인 참조에서 [Amazon S3에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요.

## 예제: 객체 작업을 위한 Amazon S3 조건 키
<a name="object-keys-in-amazon-s3-policies"></a>

다음 예제는 객체 작업에 Amazon S3별 조건 키를 사용하는 방법을 보여줍니다. 정책에 지정할 수 있는 Amazon S3 작업, 조건 키, 리소스의 전체 목록은 **서비스 승인 참조에서 [Amazon S3에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요.

몇 가지 예제 정책은 [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) 작업에서 조건 키를 사용할 수 있는 방법을 보여 줍니다. PUT Object 작업은 ACL(액세스 제어 목록) 기반 권한을 부여하는 데 사용할 수 있는 ACL 전용 헤더를 허용합니다. 이러한 조건 키를 통해 사용자가 객체를 업로드할 때 특정 액세스 권한이 필요하도록 조건을 설정할 수 있습니다. 또한 PutObjectAcl 작업을 사용하여 ACL 기반 권한을 부여할 수 있습니다. 자세한 내용은 *Amazon S3 Amazon Simple Storage Service API Reference*의 [PutObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html)을 참조하세요. ACL에 대한 자세한 내용은 [ACL(액세스 제어 목록) 개요](acl-overview.md) 섹션을 참조하세요.

**Topics**
+ [예제 1: 서버 측 암호화를 사용하여 객체를 저장하도록 요구하는 `s3:PutObject` 권한 부여](#putobject-require-sse-2)
+ [예제 2: 복사 소스에 대한 제한이 있는 객체를 복사하기 위한 `s3:PutObject` 권한 부여](#putobject-limit-copy-source-3)
+ [예시 3: 특정 버전의 객체에 대한 액세스 권한 부여](#getobjectversion-limit-access-to-specific-version-3)
+ [예시 4: 객체 태그 기반 권한 부여](#example-object-tagging-access-control)
+ [예시 5: 버킷 소유자의 AWS 계정 ID로 액세스 제한](#example-object-resource-account)
+ [예시 6: 최소 TLS 버전 요구](#example-object-tls-version)
+ [예제 7: `Deny` 문에서 특정 보안 주체 제외](#example-exclude-principal-from-deny-statement)
+ [예시 8: 클라이언트가 객체 키 이름 또는 ETags 기반으로 객체를 조건부로 업로드하도록 강제 적용](#example-conditional-writes-enforce)

### 예제 1: 서버 측 암호화를 사용하여 객체를 저장하도록 요구하는 `s3:PutObject` 권한 부여
<a name="putobject-require-sse-2"></a>

Account A에서 버킷을 소유하고 있다고 가정합니다. 계정 관리자는 Account A의 사용자인 Jane에게 항상 Amazon S3 관리형 키(SSE-S3)로 서버 측 암호화를 요청한다는 조건으로 객체를 업로드할 수 있는 권한을 부여하려고 합니다. Account A 관리자는 다음과 같은 `s3:x-amz-server-side-encryption` 조건 키를 사용하여 이 요구 사항을 지정할 수 있습니다. 다음 `Condition` 블록의 키-값 페어는 `s3:x-amz-server-side-encryption` 조건 키와 SSE-S3(`AES256`)를 암호화 유형으로 지정합니다.

```
"Condition": {
     "StringNotEquals": {
         "s3:x-amz-server-side-encryption": "AES256"
     }}
```

AWS CLI를 사용하여 이 권한을 테스트할 때는 다음 예제와 같이 `--server-side-encryption` 파라미터를 사용하여 필요한 암호화를 추가해야 합니다. 이 예 명령을 사용하려면 `user input placeholders`를 실제 정보로 대체하세요.

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountAadmin
```

### 예제 2: 복사 소스에 대한 제한이 있는 객체를 복사하기 위한 `s3:PutObject` 권한 부여
<a name="putobject-limit-copy-source-3"></a>

`PUT` 객체 요청에서 소스 객체를 지정하면 요청은 복사 작업에 해당합니다([https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html) 참조). 따라서 버킷 소유자는 원본에 대한 제한이 있는 객체 복사 권한을 사용자에게 부여할 수 있습니다. 예를 들면 다음과 같습니다.
+ 지정한 소스 버킷에서만 객체 복사를 허용합니다(예: `amzn-s3-demo-source-bucket`).
+ 지정한 소스 버킷에서 객체를 복사할 수 있으며, *`public/`*처럼 키 이름 접두사가 특정 접두사로 시작하는 객체(예: `amzn-s3-demo-source-bucket/public/*`)만 복사할 수 있습니다.
+ 소스 버킷에서 특정 객체만 복사할 수 있습니다(예: `amzn-s3-demo-source-bucket/example.jpg`).

다음 버킷 정책은 사용자(`Dave`)에게 `s3:PutObject` 권한을 부여합니다. 이 정책은 요청에 `s3:x-amz-copy-source` 헤더를 포함하고 헤더 값으로 `/amzn-s3-demo-source-bucket/public/*` 키 이름 접두사를 지정하는 조건을 충족하는 객체만 복사하도록 허용합니다. 이 정책 예를 사용하려면 `user input placeholders`를 실제 정보로 바꾸세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Sid": "cross-account permission to user in your own account",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/Dave"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
        },
        {
            "Sid": "Deny your user permission to upload object if copy source is not /bucket/prefix",
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/Dave"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
            "Condition": {
                "StringNotLike": {
                    "s3:x-amz-copy-source": "amzn-s3-demo-source-bucket/public/*"
                }
            }
        }
    ]
}
```

------

**AWS CLI에서 정책 테스트**  
AWS CLI `copy-object` 명령을 사용하는 권한을 테스트할 수 있습니다. `--copy-source` 파라미터를 추가하여 원본을 지정할 수 있습니다. 이때 키 이름은 정책에 허용된 접두사와 일치해야 합니다. `--profile` 파라미터를 사용하는 사용자 Dave의 자격 증명을 제공해야 합니다. AWS CLI 설정에 대한 자세한 내용은 **Amazon S3 API 참조의 [AWS CLI를 사용하여 Amazon S3에서 개발](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)을 참조하세요.

```
aws s3api copy-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg 
--copy-source amzn-s3-demo-source-bucket/public/PublicHappyFace1.jpg --profile AccountADave
```

**특정 객체만 복사할 수 있는 권한 부여**  
앞서 다룬 정책에서는 `StringNotLike` 조건을 사용합니다. 특정 객체만 복사할 수 있는 권한을 부여하려면 `StringNotLike`에서 `StringNotEquals`로 조건을 변경한 뒤 다음 예제와 같이 정확한 객체 키를 지정합니다. 이 예 명령을 사용하려면 `user input placeholders`를 실제 정보로 대체하세요.

```
"Condition": {
       "StringNotEquals": {
           "s3:x-amz-copy-source": "amzn-s3-demo-source-bucket/public/PublicHappyFace1.jpg"
       }
}
```

### 예시 3: 특정 버전의 객체에 대한 액세스 권한 부여
<a name="getobjectversion-limit-access-to-specific-version-3"></a>

Account A에서 버전 관리가 활성화된 버킷을 소유하고 있다고 가정합니다. 버킷에는 몇 가지 버전의 `HappyFace.jpg` 객체가 있습니다. 이제 Account A 관리자는 사용자 `Dave`에게 특정 버전의 객체만 가져올 수 있는 권한을 부여하려고 합니다. 계정 관리자는 다음 예제와 같이 조건부로 사용자 `Dave`에게 `s3:GetObjectVersion` 권한을 부여하여 이 작업을 수행할 수 있습니다. `Condition` 블록의 키-값 페어는 `s3:VersionId` 조건 키를 지정합니다. 이 경우 지정된 버전 관리를 사용하는 버킷에서 객체를 가져오려면 `Dave`에서 정확한 객체 버전 ID를 알고 있어야 합니다. 이 정책 예를 사용하려면 `user input placeholders`를 실제 정보로 바꾸세요.

자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)를 참조하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/Dave"
            },
            "Action": "s3:GetObjectVersion",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/HappyFace.jpg"
        },
        {
            "Sid": "statement2",
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/Dave"
            },
            "Action": "s3:GetObjectVersion",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/HappyFace.jpg",
            "Condition": {
                "StringNotEquals": {
                    "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e"
                }
            }
        }
    ]
}
```

------

**AWS CLI에서 정책 테스트**  
`--version-id` 파라미터와 함께 AWS CLI `get-object` 명령을 통해 가져올 특정 객체 버전을 식별하여 이 정책의 권한을 테스트할 수 있습니다. 이 명령은 지정된 버전의 객체를 가져와 `OutputFile.jpg` 파일에 저장합니다.

```
aws s3api get-object --bucket amzn-s3-demo-bucket --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave
```

### 예시 4: 객체 태그 기반 권한 부여
<a name="example-object-tagging-access-control"></a>

Amazon S3 작업에 객체 태그 지정 조건 키를 사용하는 방법에 대한 예제는 [태그 지정 및 액세스 제어 정책](tagging-and-policies.md) 섹션을 참조하세요.

### 예시 5: 버킷 소유자의 AWS 계정 ID로 액세스 제한
<a name="example-object-resource-account"></a>

`aws:ResourceAccount` 또는 `s3:ResourceAccount` 조건 키를 사용하여 특정 AWS 계정 ID가 소유한 Amazon S3 버킷에 대한 사용자, 역할 또는 애플리케이션 액세스를 제한하는 IAM 또는 가상 프라이빗 클라우드(VPC) 엔드포인트 정책을 작성할 수 있습니다. 이 조건 키를 사용하면 소유하지 않은 버킷에 VPC 내의 클라이언트가 액세스하는 것을 제한할 수 있습니다.

그러나 일부 AWS 서비스는 AWS 관리되는 버킷에 대한 액세스에 의존합니다. 따라서 IAM 정책에서 `aws:ResourceAccount` 또는 `s3:ResourceAccount` 키를 사용하면 이러한 리소스에 대한 액세스에도 영향을 미칠 수 있습니다. 자세한 정보는 다음 자료를 참조하세요.
+ *AWS PrivateLink 가이드*의 [지정된 AWS 계정에서 버킷에 대한 액세스 제한](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html#bucket-policies-s3)
+ *Amazon ECR 안내서*에서 [Amazon ECR이 사용하는 버킷에 대한 액세스 제한](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-minimum-s3-perms)
+ *AWS Systems Manager 가이드*의 AWS 관리되는 Amazon S3 버킷에 대해 [Systems Manager에 대한 필수 액세스 권한 제공](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-minimum-s3-permissions.html)

`aws:ResourceAccount` 및 `s3:ResourceAccount` 조건 키에 대한 자세한 내용과 사용 방법을 보여주는 예제는 **AWS 스토리지 블로그에서 [특정 AWS 계정에서 소유한 Amazon S3 버킷에 대한 액세스 제한](https://aws.amazon.com/blogs/storage/limit-access-to-amazon-s3-buckets-owned-by-specific-aws-accounts/)을 참조하세요.

### 예시 6: 최소 TLS 버전 요구
<a name="example-object-tls-version"></a>

`s3:TlsVersion` 조건 키를 사용하면 IAM, 가상 프라이빗 클라우드 엔드포인트(VPCE) 또는 버킷 정책을 작성하여 클라이언트가 사용한 TLS 버전에 따라 Amazon S3 버킷에 대한 사용자 또는 애플리케이션의 액세스를 제한할 수 있습니다. 이 조건 키를 사용하여 최소 TLS 버전을 요구하는 정책을 작성할 수 있습니다.

**참고**  
AWS 서비스가 사용자를 대신하여 다른 AWS 서비스를 직접적으로 호출하면(서비스 간 호출), `s3:TlsVersion`, `aws:SecureTransport`, `aws:SourceIp`, `aws:VpcSourceIp`를 포함한 특정 네트워크별 권한 부여 컨텍스트가 삭제됩니다. 정책에서 `Deny` 문과 함께 이러한 조건 키를 사용하는 경우 AWS 서비스 위탁자가 의도치 않게 차단될 수 있습니다. 보안 요구 사항을 유지하면서 AWS 서비스가 제대로 작동하도록 하려면 값이 `false`인 `aws:PrincipalIsAWSService` 조건 키를 추가하여 `Deny` 문에서 서비스 위탁자를 제외합니다. 예제:  

```
{
  "Effect": "Deny",
  "Action": "s3:*",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "aws:SecureTransport": "false",
      "aws:PrincipalIsAWSService": "false"
    }
  }
}
```
이 정책은 HTTPS가 사용되지 않을 때(`aws:SecureTransport`가 false) S3 작업에 대한 액세스를 거부하지만 AWS 서비스 위탁자가 아닌 사용자에게만 적용됩니다. 이렇게 하면 AWS 서비스 위탁자를 제외한 모든 위탁자에 조건부 제한이 적용됩니다.

**Example**  
다음 예제 버킷 정책은 TLS 버전이 1.2보다 낮은 클라이언트(예: 1.1 또는 1.0)의 `PutObject` 요청을 **거부합니다. 이 정책 예를 사용하려면 `user input placeholders`를 실제 정보로 바꾸세요.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1",
                "arn:aws:s3:::amzn-s3-demo-bucket1/*"
            ],
            "Condition": {
                "NumericLessThan": {
                    "s3:TlsVersion": 1.2
                }
            }
        }
    ]
}
```

**Example**  
다음 버킷 정책 예제는 TLS 버전이 1.1보다 높은 클라이언트(예: 1.2, 1.3 이상)의 `PutObject` 요청을 **허용합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1",
                "arn:aws:s3:::amzn-s3-demo-bucket1/*"
            ],
            "Condition": {
                "NumericGreaterThan": {
                    "s3:TlsVersion": 1.1
                }
            }
        }
    ]
}
```

### 예제 7: `Deny` 문에서 특정 보안 주체 제외
<a name="example-exclude-principal-from-deny-statement"></a>

다음 버킷 정책은 *`123456789012`* 계정 번호가 있는 보안 주체를 제외하고 `amzn-s3-demo-bucket`에 대한 `s3:GetObject` 액세스를 거부합니다. 이 정책 예를 사용하려면 `user input placeholders`를 실제 정보로 바꾸세요.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyAccessFromPrincipalNotInSpecificAccount",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:PrincipalAccount": [
            "123456789012"
          ]
        }
      }
    }
  ]
}
```

------

### 예시 8: 클라이언트가 객체 키 이름 또는 ETags 기반으로 객체를 조건부로 업로드하도록 강제 적용
<a name="example-conditional-writes-enforce"></a>

조건부 쓰기를 사용하면 S3 작업에 사전 조건을 지정하기 위해 `WRITE` 요청에 헤더를 더 추가할 수 있습니다. 이 헤더는 충족되지 않으면 S3 작업이 실패할 수 있는 조건을 지정합니다. 예를 들어, 객체 업로드 시 버킷에 이미 같은 키 이름을 가진 객체가 없는지 확인하여 기존 데이터를 덮어쓰지 않도록 방지할 수 있습니다. 또는 객체를 쓰기 전에 Amazon S3에서 객체의 엔터티 태그(ETag)를 확인할 수 있습니다.

버킷 정책의 조건을 사용하여 조건부 쓰기를 강제 적용하는 버킷 정책 예시는 [Amazon S3 버킷에 조건부 쓰기 강제 적용](conditional-writes-enforce.md) 섹션을 참조하세요.

## 예제: 버킷 작업을 위한 Amazon S3 조건 키
<a name="bucket-keys-in-amazon-s3-policies"></a>

다음 정책 예제는 버킷 작업에 Amazon S3별 조건 키를 사용하는 방법을 보여줍니다.

**Topics**
+ [예제 1: IP 주소를 조건으로 `s3:GetObject` 권한 부여](#AvailableKeys-iamV2)
+ [예제 2: 특정 접두사가 있는 버킷의 객체 목록 가져오기](#condition-key-bucket-ops-2)
+ [예제 3: 최대 키 수 설정](#example-numeric-condition-operators)

### 예제 1: IP 주소를 조건으로 `s3:GetObject` 권한 부여
<a name="AvailableKeys-iamV2"></a>

요청이 특정 범위의 IP 주소(예:`192.0.2.*`)에서 비롯된 경우 인증된 사용자가 `s3:GetObject` 작업을 사용하도록 권한을 부여합니다. 단, 제외하려는 IP 주소(예: `192.0.2.188`)는 예외입니다. `Condition` 블록에서 `IpAddress` 및 `NotIpAddress`가 조건에 해당하며, 각 조건에는 평가를 위한 키-값 페어가 제공됩니다. 이 예제에서의 키-값 페어는 모두 `aws:SourceIp` AWS 차원의 키를 사용합니다. 이 정책 예를 사용하려면 `user input placeholders`를 실제 정보로 바꾸세요.

**참고**  
`Condition` 블록에 지정된 `IPAddress` 및 `NotIpAddress` 키 값은 RFC 4632에 설명된 대로 CIDR 표기법을 사용합니다. 자세한 내용은 [http://www.rfc-editor.org/rfc/rfc4632.txt](http://www.rfc-editor.org/rfc/rfc4632.txt)를 참조하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action":"s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition" : {
                "IpAddress" : {
                    "aws:SourceIp": "192.0.2.0/24" 
                },
                "NotIpAddress" : {
                    "aws:SourceIp": "192.0.2.188/32" 
                } 
            } 
        } 
    ]
}
```

------

Amazon S3 정책에서 다른 AWS 전역 조건 키를 사용할 수도 있습니다. 예를 들어 VPC 엔드포인트에 대한 버킷 정책에서 `aws:SourceVpce` 및 `aws:SourceVpc` 조건 키를 지정할 수 있습니다. 구체적인 예는 [버킷 정책을 사용하여 VPC 엔드포인트에서 액세스 제어](example-bucket-policies-vpc-endpoint.md) 섹션을 참조하십시오.

**참고**  
일부 AWS 전역 조건 키의 경우, 특정 리소스 유형만 지원됩니다. 따라서 Amazon S3가 사용하려는 전역 조건 키 및 리소스 유형을 지원하는지 아니면 Amazon S3 관련 조건 키를 대신 사용해야 하는지 확인하세요. Amazon S3에 지원되는 리소스 유형과 조건 키의 전체 목록은 **서비스 승인 참조에서 [Amazon S3에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)를 참조하세요.  
S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요.

### 예제 2: 특정 접두사가 있는 버킷의 객체 목록 가져오기
<a name="condition-key-bucket-ops-2"></a>

`s3:prefix` 조건 키를 사용하여 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) API 작업의 응답을 특정 접두사가 있는 키 이름으로 제한할 수 있습니다. 버킷 소유자인 경우 이 조건 키로 사용자가 버킷에 있는 특정 접두사의 내용을 나열하도록 제한할 수 있습니다. `s3:prefix` 조건 키는 버킷의 객체가 키 이름 접두사로 정리되어 있는 경우 유용합니다.

Amazon S3 콘솔은 키 이름 접두사를 사용하여 폴더 개념을 표시합니다. 콘솔만 폴더 개념을 지원하고 Amazon S3 API는 버킷과 객체만 지원합니다. 예를 들어, 키 이름이 *`public/object1.jpg`* 및 *`public/object2.jpg`*인 2개의 객체가 있는 경우 콘솔에서는 *`public`* 폴더 아래에 객체가 표시됩니다. Amazon S3 API에서 이러한 객체는 폴더의 객체가 아니라 접두사가 있는 객체입니다. 접두사 및 구분 기호를 사용하여 액세스 권한을 필터링하는 방법에 대한 자세한 내용은 [사용자 정책을 사용하여 버킷에 대한 액세스 제어](walkthrough1.md) 섹션을 참조하세요.

다음 시나리오에서 버킷 소유자와 사용자가 속한 상위 계정은 동일합니다. 따라서 버킷 소유자는 버킷 정책 또는 사용자 정책을 사용하여 액세스 권한을 부여할 수 있습니다. `ListObjectsV2` API 작업에 사용할 수 있는 다른 조건 키에 대한 자세한 내용은 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 섹션을 참조하세요.

**참고**  
버킷에서 버전 관리가 활성화된 경우 버킷의 객체를 나열하려면 다음 정책에서 `s3:ListBucket` 권한 대신 `s3:ListBucketVersions` 권한을 부여해야 합니다. 또한, `s3:ListBucketVersions` 권한은 `s3:prefix` 조건 키를 지원합니다.

**사용자 정책**  
다음 사용자 정책은 사용자에게 요청에서 값이 `projects`인 접두사를 지정하도록 요구하는 `Condition` 문을 통해 `s3:ListBucket` 권한을 부여합니다([https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 참조). 이 정책 예를 사용하려면 `user input placeholders`를 실제 정보로 바꾸세요.

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Action": "s3:ListBucket",
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket",
         "Condition" : {
             "StringEquals" : {
                 "s3:prefix": "projects" 
             }
          } 
       },
      {
         "Sid":"statement2",
         "Effect":"Deny",
         "Action": "s3:ListBucket",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
         "Condition" : {
             "StringNotEquals" : {
                 "s3:prefix": "projects" 
             }
          } 
       }         
    ]
}
```

------

`Condition` 문은 사용자가 `projects` 접두사가 있는 객체 키만 나열하도록 제한합니다. 추가된 명시적 `Deny` 문은 사용자가 다른 권한을 가지고 있든 없든 다른 접두사가 있는 키를 나열하는 것을 거부합니다. 예를 들어, 이전 사용자 정책 업데이트 또는 버킷 정책을 통해 사용자가 제한 없이 객체 키를 나열할 수 있는 권한을 얻을 수 있습니다. 명시적 `Deny` 문은 항상 `Allow` 문보다 우선하므로, 사용자가 `projects` 접두사가 있는 키 이외의 키를 나열하려고 하면 요청이 거부됩니다.

**버킷 정책**  
사용자를 식별하는 `Principal` 요소를 위의 사용자 정책에 추가하는 경우, 다음 예제에서처럼 버킷 정책을 갖게 됩니다. 이 정책 예를 사용하려면 `user input placeholders`를 실제 정보로 바꾸세요.

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/bucket-owner"
         },  
         "Action":  "s3:ListBucket",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
         "Condition" : {
             "StringEquals" : {
                 "s3:prefix": "projects" 
             }
          } 
       },
      {
         "Sid":"statement2",
         "Effect":"Deny",
         "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/bucket-owner"
         },  
         "Action": "s3:ListBucket",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
         "Condition" : {
             "StringNotEquals" : {
                 "s3:prefix": "projects"  
             }
          } 
       }         
    ]
}
```

------

**AWS CLI에서 정책 테스트**  
다음 `list-object` AWS CLI 명령을 사용하는 정책을 테스트할 수 있습니다. 이 명령에서 `--profile` 파라미터를 사용하여 사용자 자격 증명을 제공합니다. AWS CLI 사용 및 설정에 대한 자세한 내용은 **Amazon S3 API 참조의 [AWS CLI를 사용하여 Amazon S3에서 개발](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)을 참조하세요.

```
aws s3api list-objects --bucket amzn-s3-demo-bucket --prefix projects --profile AccountA
```

### 예제 3: 최대 키 수 설정
<a name="example-numeric-condition-operators"></a>

`s3:max-keys` 조건 키를 사용하여 요청자가 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 또는 [https://docs.aws.amazon.com//AmazonS3/latest/API/API_ListObjectVersions.html](https://docs.aws.amazon.com//AmazonS3/latest/API/API_ListObjectVersions.html) 요청에서 반환할 수 있는 최대 키 수를 설정할 수 있습니다. 기본적으로 이러한 API 작업은 최대 1,000개의 키를 반환합니다. `s3:max-keys`와 함께 사용할 수 있는 숫자 조건 연산자 목록은 *IAM 사용 설명서*의 [숫자 조건 연산자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Numeric)를 참조하세요.