

# API Gateway 리소스 정책을 사용하여 REST API에 대한 액세스 제어
<a name="apigateway-resource-policies"></a>

Amazon API Gateway *리소스 정책*은 지정된 보안 주체(보통 IAM 역할 또는 그룹)가 API를 호출할 수 있는지 여부를 제어하기 위해 API에 연결하는 JSON 정책 문서입니다. API Gateway 리소스 정책을 사용하여 다음과 같은 엔터티의 안전한 API 호출을 허용할 수 있습니다.
+ 지정된 AWS 계정의 사용자.
+ 지정된 소스 IP 주소 범위 또는 CIDR 블록.
+ 지정된 가상 사설 클라우드(VPC) 또는 VPC 종단점(계정 무관).

AWS Management Console, AWS CLI 또는 AWS SDK를 사용하여 API Gateway에 모든 API 엔드포인트 유형에 대한 리소스 정책을 연결할 수 있습니다. [프라이빗 API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html)의 경우 VPC 종단점 정책과 함께 리소스 정책을 사용하여 어떤 주체가 어떤 리소스 및 작업에 대한 액세스를 가질지를 제어할 수 있습니다. 자세한 내용은 [API Gateway의 프라이빗 API에 대한 VPC 종단점 정책 사용](apigateway-vpc-endpoint-policies.md) 섹션을 참조하세요.

 API Gateway 리소스 정책은 IAM 자격 증명 기반 정책과 다릅니다. IAM 정책은 IAM 엔터티(사용자, 그룹 또는 역할)에 연결되어 이들 엔터티가 어떤 리소스에 대해 어떤 조치를 취할 수 있는지 정의합니다. API Gateway 리소스 정책은 리소스에 연결됩니다. API Gateway 리소스 정책을 IAM 정책과 함께 사용할 수 있습니다. 자세한 내용은 [자격 증명 기반 정책 및 리소스 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)을 참조하세요.

**Topics**
+ [Amazon API Gateway에 대한 액세스 정책 언어 개요](apigateway-control-access-policy-language-overview.md)
+ [API Gateway 리소스 정책이 권한 부여 워크플로우에 미치는 영향](apigateway-authorization-flow.md)
+ [API Gateway 리소스 정책 예제](apigateway-resource-policies-examples.md)
+ [API Gateway 리소스 정책을 생성하여 API에 연결](apigateway-resource-policies-create-attach.md)
+ [AWSAPI Gateway 리소스 정책에 사용할 수 있는 조건 키](apigateway-resource-policies-aws-condition-keys.md)

# Amazon API Gateway에 대한 액세스 정책 언어 개요
<a name="apigateway-control-access-policy-language-overview"></a>

이 페이지에서는 Amazon API Gateway 리소스 정책에 사용되는 기본 요소를 설명합니다.

IAM 정책과 동일한 구문을 사용하여 리소스 정책이 지정됩니다. 전체 정책 언어에 대한 정보는 **IAM 사용 설명서의 [IAM 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) 및 [AWS Identity and Access Management 정책 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)를 참조하세요.

AWS 서비스가 어떻게 해당 요청의 허용 또는 거부 여부를 결정하는지에 대한 자세한 내용은 [요청의 허용 또는 거부 결정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow) 단원을 참조하세요.

## 액세스 정책의 공통 요소
<a name="apigateway-common-elements-in-an-access-policy"></a>

가장 기본적인 경우, 리소스 정책에는 다음 요소가 포함되어 있습니다.
+ **리소스** – API는 권한을 허용 또는 거부할 수 있는 Amazon API Gateway 리소스입니다. 정책에서는 Amazon 리소스 이름(ARN)을 사용하여 리소스를 식별해야 합니다. 리소스 정책을 저장할 때 API Gateway가 전체 ARN으로 자동으로 확장하는 약식 구문을 사용할 수도 있습니다. 자세한 내용은 [API Gateway 리소스 정책 예제](apigateway-resource-policies-examples.md) 단원을 참조하세요.

  전체 `Resource` 요소의 형식은 [API Gateway의 API 실행 권한 리소스 형식](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-iam-policy-resource-format-for-executing-api) 단원을 참조하세요.
+ **작업** - 각 리소스에 대해 Amazon API Gateway는 작업의 집합을 지원합니다. 작업 키워드를 사용하여 허용(또는 거부)할 리소스 작업을 식별합니다.

  예를 들어 `execute-api:Invoke` 권한은 사용자가 클라이언트 요청 시 API를 호출할 수 있도록 허용합니다.

  `Action` 요소의 형식은 [API Gateway의 API 실행 권한 작업 형식](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-iam-policy-action-format-for-executing-api) 단원을 참조하세요.
+ **효과** - 사용자가 특정 작업을 요청하는 경우의 효과입니다. 이는 `Allow` 또는 `Deny` 중에 하나가 될 수 있습니다. 다른 정책에서 액세스 권한을 부여하는 경우라도 사용자가 해당 리소스에 액세스할 수 없도록 하기 위해 리소스에 대한 권한을 명시적으로 거부할 수도 있습니다.
**참고**  
"암시적 거부"는 "기본 거부"와 동일합니다.  
“암시적 거부”는 “명시적 거부”와 다릅니다. 자세한 내용은 [기본 거부와 명시적 거부의 차이](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#AccessPolicyLanguage_Interplay) 단원을 참조하세요.
+ **보안 주체** - 문에서의 작업 및 리소스에 액세스할 수 있는 계정 또는 사용자입니다. 리소스 정책에서 보안 주체는 이 권한을 수신하는 사용자나 계정입니다.

다음의 리소스 정책 예시는 이전의 공통 정책 요소를 나타냅니다. 이 정책은 소스 IP 주소가 *123.4.5.6/24* 주소 블록에 속하는 사용자에게 지정된 *region*의 지정된 *account-id*에서 API에 대한 액세스 권한을 부여합니다. 이 정책은 사용자의 소스 IP가 해당 범위 내에 있지 않으면 API에 대한 모든 액세스를 거부합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:*"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "123.4.5.6/24"
                }
            }
        }
    ]
}
```

------

# API Gateway 리소스 정책이 권한 부여 워크플로우에 미치는 영향
<a name="apigateway-authorization-flow"></a>

API Gateway가 API에 연결된 리소스 정책을 평가할 때 그 결과는, 다음 단원의 흐름 차트에 서명된 것처럼, APi에 대하여 정의한 인증 유형의 영향을 받습니다.

**Topics**
+ [API Gateway 리소스 정책만](#apigateway-authorization-flow-resource-policy-only)
+ [Lambda 권한 부여자 및 리소스 정책](#apigateway-authorization-flow-lambda)
+ [IAM 인증 및 리소스 정책](#apigateway-authorization-flow-iam)
+ [Amazon Cognito 인증 및 리소스 정책](#apigateway-authorization-flow-cognito)
+ [정책 평가 결과표](#apigateway-resource-policies-iam-policies-interaction)

## API Gateway 리소스 정책만
<a name="apigateway-authorization-flow-resource-policy-only"></a>

이 워크플로우에서 API Gateway 리소스 정책은 API에 연결되지만 API에 대하여 정의되는 인증 유형은 없습니다. 정책 평가를 위해서는 호출자의 인바운드 기준에 따른 명시적 허용이 필요합니다. 묵시적 거부 또는 명시적 거부는 호출자에 대한 거부로 이어집니다.

![\[리소스 정책의 권한 부여 흐름만.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/apigateway-auth-resource-policy-only.png)


다음은 이러한 리소스 정책의 예입니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:api-id/",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

## Lambda 권한 부여자 및 리소스 정책
<a name="apigateway-authorization-flow-lambda"></a>

이 워크플로우에서 Lambda 권한 부여자는 리소스 정책과 함께 API에 대하여 구성됩니다. 리소스 정책은 2단계로 평가됩니다. Lambda 권한 부여자를 호출하기 전에 API Gateway는 먼저 정책을 평가하고 명시적 거부를 확인합니다. 명시적 거부가 확인되면 호출자는 즉시 액세스를 거부당합니다. 그렇지 않으면 Lambda 권한 보유자가 호출되어 리소스 정책과 결합하여 평가되는 [정책 문서](api-gateway-lambda-authorizer-output.md)를 반환합니다. 권한 부여자가 캐싱을 사용하는 경우 API Gateway는 캐싱된 정책 문서를 반환할 수 있습니다. 그 결과는 [테이블 A](#apigateway-resource-policies-iam-policies-interaction)에 따라 결정됩니다.

다음의 리소스 정책 예제는 그 VPC 엔드포인트 ID가 `vpce-1a2b3c4d`인 VPC 엔드포인트로부터의 호출만을 허용합니다. “인증 전” 평가 과정 중에는 예제에 나온 VPC 종단점에서의 호출만이 다음 단계로 넘어가 Lambda 권한 부여자를 평가하는 것이 허용됩니다. 나머지 모든 호출은 차단됩니다. 프라이빗 API에 사용자 지정 도메인 이름을 사용하는 경우 이 권한 부여 워크플로는 동일합니다.

![\[리소스 정책과 Lambda 권한 부여자의 권한 부여 흐름.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/apigateway-auth-lambda-resource-policy.png)


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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:us-east-1:111111111111:api-id/"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
}
```

------

## IAM 인증 및 리소스 정책
<a name="apigateway-authorization-flow-iam"></a>

이 워크플로에서 리소스 정책 외에도 API에 대한 IAM 인증을 구성합니다. IAM 서비스로 사용자를 인증한 후에는 API가 사용자에게 연결된 정책과 리소스 정책을 모두 평가합니다. 그 결과는 호출자가 동일한 AWS 계정에 있는지 또는 API 소유자의 별도 AWS 계정에 있는지에 따라 달라집니다.

호출자와 API 소유자가 각기 다른 계정에 있는 경우, IAM 정책과 리소스 정책 모두 호출자가 진행하도록 명시적으로 허용합니다. 자세한 내용은 [테이블 B](#apigateway-resource-policies-iam-policies-interaction)를 참조하세요.

그러나 호출자와 API 소유자가 동일한 AWS 계정에 있는 경우, IAM 사용자 정책 또는 리소스 정책 중 하나에서 호출자가 진행하도록 명시적으로 허용합니다. 자세한 내용은 [테이블 A](#apigateway-resource-policies-iam-policies-interaction)를 참조하세요.

![\[리소스 정책과 IAM 인증의 권한 부여 흐름.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/apigateway-auth-iam-resource-policy.png)


다음은 교차 계정 리소스 정책의 예입니다. IAM 정책에 허용 효과가 포함되어 있다고 가정할 때, 이 리소스 정책은 VPC ID가 `vpc-2f09a348`인 VPC로부터의 호출만을 허용합니다 자세한 내용은 [테이블 B](#apigateway-resource-policies-iam-policies-interaction)를 참조하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:us-east-1:111111111111:api-id/"
            ],
            "Condition" : {
                "StringEquals": {
                    "aws:SourceVpc": "vpc-2f09a348"
                    }
            }
        }
    ]
}
```

------

## Amazon Cognito 인증 및 리소스 정책
<a name="apigateway-authorization-flow-cognito"></a>

이 워크플로에서는 리소스 정책 외에 API에 대해 [Amazon Cognito 사용자 풀](apigateway-integrate-with-cognito.md)이 구성됩니다. API Gateway는 먼저 Amazon Cognito를 통해 호출자에게 권한을 부여하려 합니다. 이는 보통 호출자가 제공하는 [JWT 토큰](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)을 통해 수행됩니다. 인증에 성공하면, 리소스 정책이 독립적으로 평가되고 명시적 허용이 필요해집니다. 거부 또는 “허용도 거부도 아님”인 경우에는 거부됩니다. 다음은 Amazon Cognito 사용자 풀과 함께 사용될 수 있는 리소스 정책의 예제입니다.

![\[리소스 정책과 Amazon Cognito 권한 부여자의 권한 부여 흐름.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/apigateway-auth-cognito-resource-policy.png)


다음은 Amazon Cognito 인증 토큰에 허용이 포함되어 있다는 가정하에 지정된 소스 IP로부터의 호출만을 허용하는 리소스 정책의 예제입니다 자세한 내용은 [테이블 B](#apigateway-resource-policies-iam-policies-interaction)를 참조하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:api-id/",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

## 정책 평가 결과표
<a name="apigateway-resource-policies-iam-policies-interaction"></a>

테이블 A에는 API Gateway API에 대한 액세스가 IAM 정책 또는 Lambda 권한 부여자 및 API Gateway 리소스 정책에 의해 제어되고, 이러한 두 정책이 모두 동일한 AWS 계정에 있을 때 결과로 수행되는 동작이 나와 있습니다.


| **IAM 정책(또는 Lambda 권한 부여자)** | **API Gateway 리소스 정책** | **결과적 동작** | 
| --- | --- | --- | 
| 허용 | 허용 | 허용 | 
| 허용 | 허용도 거부도 아님 | 허용 | 
| 허용 | 거부 | 명시적 거부 | 
| 허용도 거부도 아님 | 허용 | 허용 | 
| 허용도 거부도 아님 | 허용도 거부도 아님 | 암시적 거부 | 
| 허용도 거부도 아님 | 거부 | 명시적 거부 | 
| 거부 | 허용 | 명시적 거부 | 
| 거부 | 허용도 거부도 아님 | 명시적 거부 | 
| 거부 | 거부 | 명시적 거부 | 

테이블 B에는 API Gateway API에 대한 액세스가 IAM 정책 또는 Amazon Cognito 사용자 풀 권한 부여자 및 API Gateway 리소스 정책 에 의해 제어되고, 이러한 정책이 서로 다른 AWS 계정에 있을 때 결과로 수행되는 동작이 나와 있습니다. 허용되지도 거부되지도 않으면, 교차 계정 액세스가 거부됩니다. 왜냐하면 크로스 계정 액세스를 위해서는 리소스 정책과 IAM 정책 또는 Amazon Cognito 사용자 풀 권한 부여자 모두에서 액세스를 명시적으로 허용해야 하기 때문입니다.


| **IAM 정책(또는 Amazon Cognito 사용자 풀 권한 부여자)** | **API Gateway 리소스 정책** | **결과적 동작** | 
| --- | --- | --- | 
| 허용 | 허용 | 허용 | 
| 허용 | 허용도 거부도 아님 | 암시적 거부 | 
| 허용 | 거부 | 명시적 거부 | 
| 허용도 거부도 아님 | 허용 | 암시적 거부 | 
| 허용도 거부도 아님 | 허용도 거부도 아님 | 암시적 거부 | 
| 허용도 거부도 아님 | 거부 | 명시적 거부 | 
| 거부 | 허용 | 명시적 거부 | 
| 거부 | 허용도 거부도 아님 | 명시적 거부 | 
| 거부 | 거부 | 명시적 거부 | 

# API Gateway 리소스 정책 예제
<a name="apigateway-resource-policies-examples"></a>

이 페이지에서는 API Gateway 리소스 정책의 일반적인 사용 사례에 대한 몇 가지 예제를 제시합니다.

다음 예제 정책은 간소화된 구문을 사용하여 API 리소스를 지정합니다. 이 간소화된 구문은 전체 Amazon 리소스 이름(ARN)을 지정하는 대신 API 리소스를 참조할 수 있는 약식 방법입니다. API Gateway는 정책을 저장할 때 약어 구문을 전체 ARN으로 변환합니다. 예를 들어 리소스 정책에서 `execute-api:/stage-name/GET/pets` 리소스를 지정할 수 있습니다. API Gateway는 리소스 정책을 저장할 때 이 리소스를 `arn:aws:execute-api:us-east-2:123456789012:aabbccddee/stage-name/GET/pets`로 변환합니다. API Gateway는 현재 리전, AWS 계정 ID 및 리소스 정책이 연결된 REST API의 ID를 사용하여 전체 ARN을 구축합니다. `execute-api:/*`를 사용하여 현재 API의 모든 단계, 메서드 및 경로를 나타낼 수 있습니다. 액세스 정책 언어에 대한 자세한 내용은 [Amazon API Gateway에 대한 액세스 정책 언어 개요](apigateway-control-access-policy-language-overview.md) 단원을 참조하세요.

**Topics**
+ [예제: 다른 AWS 계정의 역할이 API를 사용하도록 허용](#apigateway-resource-policies-cross-account-example)
+ [예제: 소스 IP 주소 또는 범위에 따라 API 트래픽 거부](#apigateway-resource-policies-source-ip-address-example)
+ [예: 프라이빗 API를 사용할 때 소스 IP 주소 또는 범위를 기반으로 API 트래픽 거부](#apigateway-resource-policies-source-ip-address-vpc-example)
+ [예제: 소스 VPC 또는 VPC 종단점에 따라 프라이빗 API 트래픽 허용](#apigateway-resource-policies-source-vpc-example)

## 예제: 다른 AWS 계정의 역할이 API를 사용하도록 허용
<a name="apigateway-resource-policies-cross-account-example"></a>

다음의 리소스 정책 예제는 [Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html)(SigV4) 또는 [Signature Version 4a](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html#how-sigv4a-works)(SigV4a) 프로토콜을 통해 한 AWS 계정의 API 액세스 권한을 다른 AWS 계정의 두 역할에 부여합니다. 예를 들면 `account-id-2`로 식별된 AWS 계정의 개발자와 관리자 역할에 AWS 계정의 `pets` 리소스(API)에서 `GET` 작업을 실행할 수 있는 `execute-api:Invoke` 작업에 대한 권한이 부여됩니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:role/developer",
                    "arn:aws:iam::111122223333:role/Admin"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/stage/GET/pets"
            ]
        }
    ]
}
```

------

## 예제: 소스 IP 주소 또는 범위에 따라 API 트래픽 거부
<a name="apigateway-resource-policies-source-ip-address-example"></a>

아래의 리소스 정책 예제에서는 2개의 지정된 소스 IP 주소 블록에서 API로 들어오는 트래픽을 거부(차단)합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
               "execute-api:/*"
            ],
            "Condition" : {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

IAM 사용자 정책 또는 API Gateway 리소스 정책을 사용하여 API Gateway 또는 API Gateway API에 대한 액세스를 제어하는 경우 정책이 IPv6 주소 범위를 포함하도록 업데이트되었는지 확인합니다. IPv6 주소를 처리하도록 업데이트되지 않은 정책은 클라이언트가 듀얼 스택 엔드포인트를 사용하기 시작할 때 API Gateway에 대한 클라이언트의 액세스에 영향을 미칠 수 있습니다. 자세한 내용은 [IAM 정책에서 IPv6 주소 사용](api-ref.md#api-reference-service-endpoints-dualstack-iam) 섹션을 참조하세요.

## 예: 프라이빗 API를 사용할 때 소스 IP 주소 또는 범위를 기반으로 API 트래픽 거부
<a name="apigateway-resource-policies-source-ip-address-vpc-example"></a>

아래의 리소스 정책 예제에서는 2개의 지정된 소스 IP 주소 블록에서 프라이빗 API로 들어오는 트래픽을 거부(차단)합니다. 프라이빗 API를 사용할 때 `execute-api`의 VPC 종단점은 원래 소스 IP 주소를 다시 기록합니다. `aws:VpcSourceIp` 조건은 원래 요청자 IP 주소를 기준으로 요청을 필터링합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
               "execute-api:/*"
            ],
            "Condition" : {
                "IpAddress": {
                    "aws:VpcSourceIp": ["192.0.2.0/24", "198.51.100.0/24"]
                }
            }
        }
    ]
}
```

------

## 예제: 소스 VPC 또는 VPC 종단점에 따라 프라이빗 API 트래픽 허용
<a name="apigateway-resource-policies-source-vpc-example"></a>

다음 예제의 리소스 정책에서는 지정된 Virtual Private Cloud(VPC) 또는 VPC 종단점에서 오는 수신 트래픽만 프라이빗 API에 액세스하도록 허용합니다.

이 리소스 정책 예제는 소스 VPC를 지정합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                   "aws:SourceVpc": "vpc-1a2b3c4d"
                }
            }
        }
    ]
}
```

------

이 리소스 정책 예제는 소스 VPC 종단점을 지정합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
}
```

------

# API Gateway 리소스 정책을 생성하여 API에 연결
<a name="apigateway-resource-policies-create-attach"></a>

사용자가 API 실행 서비스를 호출하여 API에 액세스하도록 허용하려면 API Gateway 리소스 정책을 생성하고 이 정책을 API에 연결해야 합니다. API에 정책을 연결하면 정책의 해당 권한이 API의 메서드에 적용됩니다. 리소스 정책을 업데이트하는 경우 API를 배포해야 합니다.

**Topics**
+ [사전 조건](#apigateway-resource-policies-prerequisites)
+ [API Gateway API에 리소스 정책 연결](#apigateway-resource-policies-create-attach-procedure)
+ [리소스 정책 문제 해결](#apigateway-resource-policies-troubleshoot)

## 사전 조건
<a name="apigateway-resource-policies-prerequisites"></a>

 API Gateway 리소스 정책을 업데이트하려면 `apigateway:UpdateRestApiPolicy` 권한과 `apigateway:PATCH` 권한이 있어야 합니다.

엣지 최적화 또는 리전 API의 경우 API를 생성할 때 또는 배포한 후에 리소스 정책을 API에 연결할 수 있습니다. 프라이빗 API의 경우 리소스 정책 없이는 API를 배포할 수 없습니다. 자세한 내용은 [API Gateway의 프라이빗 REST API](apigateway-private-apis.md) 섹션을 참조하세요.

## API Gateway API에 리소스 정책 연결
<a name="apigateway-resource-policies-create-attach-procedure"></a>

다음 절차는 API Gateway API에 리소스 정책을 연결하는 방법을 보여줍니다.

------
#### [ AWS Management Console ]

**API Gateway API에 리소스 정책을 연결하려면**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. REST API를 선택합니다.

1. 기본 탐색 창에서 **리소스 정책**을 선택합니다.

1. **정책 생성**을 선택합니다.

1. (선택 사항) 예제 정책을 생성하려면 **템플릿 선택**을 선택합니다.

   여기 나온 정책 예제에서는 자리 표시자가 이중 중괄호(`"{{placeholder}}"`)로 묶여 있습니다. 중괄호를 포함한 각각의 자리 표시자를 필요한 정보로 바꿉니다.

1. 템플릿 예제 중 하나를 사용하지 않는 경우에는 리소스 정책을 입력합니다.

1. **변경 사항 저장**을 선택합니다.

API Gateway 콘솔에서 이미 배포한 API라면 다시 배포해야 리소스 정책이 적용됩니다.

------
#### [ AWS CLI ]

AWS CLI를 사용하여 새 API를 생성하고 여기에 리소스 정책을 연결하려면 다음 [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) 명령을 사용합니다.

```
aws apigateway create-rest-api \
    --name "api-name" \
    --policy "{\"jsonEscapedPolicyDocument\"}"
```

AWS CLI를 사용하여 기존 API에 리소스 정책을 연결하려면 다음 [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) 명령을 사용합니다.

```
aws apigateway update-rest-api \
    --rest-api-id api-id \
    --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'
```

리소스 정책을 별도의 `policy.json` 파일로 첨부하여 [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) 명령에 포함할 수도 있습니다. 다음 [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) 명령은 리소스 정책을 사용하여 새 API를 생성합니다.

```
aws apigateway create-rest-api \
    --name "api-name" \
    --policy file://policy.json
```

`policy.json`은 API Gateway 리소스 정책(예: [예제: 소스 IP 주소 또는 범위에 따라 API 트래픽 거부](apigateway-resource-policies-examples.md#apigateway-resource-policies-source-ip-address-example))입니다.

------
#### [ AWS CloudFormation ]

CloudFormation를 사용하여 리소스 정책을 사용하여 API를 생성할 수 있습니다. 다음 예시에서는 예제 리소스 정책인 [예제: 소스 IP 주소 또는 범위에 따라 API 트래픽 거부](apigateway-resource-policies-examples.md#apigateway-resource-policies-source-ip-address-example)을 사용하여 REST API를 만듭니다.

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: testapi
      Policy:
        Statement:
          - Action: 'execute-api:Invoke'
            Effect: Allow
            Principal: '*'
            Resource: 'execute-api:/*'
          - Action: 'execute-api:Invoke'
            Effect: Deny
            Principal: '*'
            Resource: 'execute-api:/*'
            Condition:
              IpAddress: 
                'aws:SourceIp': ["192.0.2.0/24", "198.51.100.0/24" ]
        Version: 2012-10-17		 	 	 
  Resource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId
      PathPart: 'helloworld'
  MethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref Resource
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      Integration:
        Type: MOCK
        RequestTemplates:
          application/json: '{"statusCode": 200}'
        IntegrationResponses:
          - StatusCode: 200
            ResponseTemplates:
              application/json: '{}'
      MethodResponses:
        - StatusCode: 200
          ResponseModels:
            application/json: 'Empty'
  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - MethodGet
    Properties:
      RestApiId: !Ref Api
      StageName: test
```

------

## 리소스 정책 문제 해결
<a name="apigateway-resource-policies-troubleshoot"></a>

다음 문제 해결 지침은 리소스 정책 관련 문제를 해결하는 데 도움이 될 수 있습니다.

### 내 API에서 \$1"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:\$1\$1\$1\$1\$1\$1\$1\$1/\$1\$1\$1\$1/\$1\$1\$1\$1/"\$1를 반환합니다.
<a name="apigateway-resource-policies-troubleshoot-auth"></a>

리소스 정책에서 다음과 같이 보안 주체를 AWS 보안 주체로 설정하는 경우

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111111111111:role/developer",
                    "arn:aws:iam::111111111111:role/Admin"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/stage/GET/pets"
            ]
        }
    ]
}
```

------

API의 모든 메서드에 `AWS_IAM` 권한 부여를 사용해야 합니다. 그렇지 않으면 API가 이전 오류 메시지를 반환합니다. 메서드에 대한 `AWS_IAM` 권한 부여를 켜는 방법에 대한 자세한 지침은 [API Gateway의 REST API 메서드](how-to-method-settings.md) 섹션을 참조하세요.

### 내 리소스 정책이 업데이트되지 않습니다.
<a name="apigateway-resource-policies-troubleshoot-deploy"></a>

 API가 생성된 후에 리소스 정책을 업데이트하려면 업데이트된 정책을 연결한 후에 변경 내용이 전파되도록 API를 배포해야 합니다. 정책을 업데이트 또는 저장하는 것만으로는 API의 실행 시간 동작이 변경되지 않습니다. API 배포에 대한 자세한 내용은 [API Gateway에서 REST API 배포](how-to-deploy-api.md) 단원을 참조하세요.

### 리소스 정책에서 ‘정책 문서가 잘못됨’이라는 오류가 반환됩니다. 정책 구문을 확인하고 보안 주체가 유효한지 확인하세요.
<a name="apigateway-resource-policies-troubleshoot-invalid-principal"></a>

이 오류를 해결하려면 먼저 정책 구문을 확인하는 것이 좋습니다. 자세한 내용은 [Amazon API Gateway에 대한 액세스 정책 언어 개요](apigateway-control-access-policy-language-overview.md) 섹션을 참조하세요. 또한 지정된 모든 보안 주체가 유효하고 삭제되지 않았는지 확인하는 것이 좋습니다.

또한 API가 [옵트인 리전](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#optinregion)에 있는 경우 리소스 정책의 모든 계정에 리전이 활성화되어 있는지 확인하세요.

# AWSAPI Gateway 리소스 정책에 사용할 수 있는 조건 키
<a name="apigateway-resource-policies-aws-condition-keys"></a>

다음 표에는 각각의 권한 부여 유형에 대해 API Gateway에서 API를 위한 리소스 정책에서 사용할 수 있는 AWS 조건 키가 포함되어 있습니다.

AWS 조건 키에 대한 자세한 내용은 [AWS 전역 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html) 단원을 참조하세요.


| **조건 키**: | **기준** | **이 필요합니까?`AuthN`** | **권한 부여 유형** | 
| --- | --- | --- | --- | 
| aws:CurrentTime | 없음 | 아니요 | 모두 | 
| aws:EpochTime | 없음 | 아니요 | 모두 | 
| aws:TokenIssueTime | 임시 보안 자격 증명을 사용해 서명된 요청에만 키가 존재합니다. | 예 | IAM | 
| aws:MultiFactorAuthPresent | 임시 보안 자격 증명을 사용해 서명된 요청에만 키가 존재합니다. | 예 | IAM | 
| aws:MultiFactorAuthAge | MFA가 요청에 존재하는 경우에만 키가 존재합니다. | 예 | IAM | 
| aws:PrincipalAccount | 없음 | 예 | IAM | 
| aws:PrincipalArn | 없음 | 예 | IAM | 
| aws:PrincipalOrgID | 이 키는 보안 주체가 조직의 멤버인 경우에만 요청 컨텍스트에 포함됩니다. | 예 | IAM | 
| aws:PrincipalOrgPaths | 이 키는 보안 주체가 조직의 멤버인 경우에만 요청 컨텍스트에 포함됩니다. | 예 | IAM | 
| aws:PrincipalTag | 이 키는 보안 주체가 태그가 연결된 IAM 사용자를 사용하는 경우 요청 컨텍스트에 포함됩니다. 연결된 태그 또는 세션 태그가 있는 IAM 역할을 사용하는 보안 주체에 포함됩니다. | 예 | IAM | 
| aws:PrincipalType | 없음 | 예 | IAM | 
| aws:Referer | HTTP 헤더에서 호출자가 값을 제공하는 경우에만 키가 존재합니다. | 아니요 | 모두 | 
| aws:SecureTransport | 없음 | 아니요 | 모두 | 
| aws:SourceArn | 없음 | 아니요 | 모두 | 
| aws:SourceIp | 없음 | 아니요 | 모두 | 
| aws:SourceVpc | 이 키는 프라이빗 API에만 사용할 수 있습니다. | 아니요 | 모두 | 
| aws:SourceVpce | 이 키는 프라이빗 API에만 사용할 수 있습니다. | 아니요 | 모두 | 
| aws:VpcSourceIp | 이 키는 프라이빗 API에만 사용할 수 있습니다. | 아니요 | 모두 | 
| aws:UserAgent | HTTP 헤더에서 호출자가 값을 제공하는 경우에만 키가 존재합니다. | 아니요 | 모두 | 
| aws:userid | 없음 | 예 | IAM | 
| aws:username | 없음 | 예 | IAM | 