API Gateway REST API와 함께 Lambda 권한 부여자를 사용할 때 발생하는 HTTP 403 Forbidden 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 5월 14일

Lambda 권한 부여자를 생성한 후 Amazon API Gateway REST API를 호출하면 403 Forbidden 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

참고: API Gateway는 다양한 이유로 403 Forbidden 오류를 반환할 수 있습니다. 이 문서에서는 REST API에 대해 구성된 Lambda 권한 부여자와 관련된 403 오류만 해결합니다.

Lambda 권한 부여자를 사용하는 API Gateway REST API가 403 오류를 반환하는 경우, 일반적으로 다음과 같은 이유 중 하나가 원인입니다.

  • 값이 누락되거나 null이거나 비어 있는 잘못된 토큰 또는 자격 증명 원본이 API 호출에 있습니다.
  • Lambda 권한 부여자 함수가 호출자에 대한 액세스를 명시적으로 거부하는 AWS Identity and Access Management(IAM) 정책 문서를 반환합니다.
  • API에 호출자에 대한 액세스를 명시적으로 거부하는 연결된 리소스 정책이 있습니다.

​해결 방법

다음 문제 해결 단계를 따르면 오류의 원인을 파악하고 문제를 해결하는 데 도움이 됩니다.

오류 원인 파악

1.    API Gateway의 응답에서 오류 메시지를 검토합니다.

API 호출에 잘못된 토큰 또는 자격 증명 원본이 포함되어 있는 경우, 다음과 유사한 오류 메시지가 표시됩니다.

{
    errorMessage: Unauthorized
}

Lambda 권한 부여자 함수가 명시적 거부가 포함된 IAM 정책 문서를 반환한 경우, 다음과 유사한 오류 메시지가 표시됩니다.

{
    errorMessage: User is not authorized to access this resource with an explicit deny
}

API에 호출자에 대한 액세스를 묵시적으로 또는 명시적으로 거부하는 연결된 리소스 정책이 있는 경우, 다음과 유사한 오류 메시지가 표시됩니다.

{
 Message: "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn>"
}

2.    CloudWatch에서 API Gateway 실행 로그를 확인하고 인증 워크플로우를 검토합니다. Lambda 권한 부여자의 출력API Gateway의 리소스 정책 평가 결과를 볼 수 있습니다.

참고: Amazon CloudWatch Logs에 대한 API Gateway 로깅을 아직 활성화하지 않은 경우 API Gateway REST API 또는 WebSocket API 문제 해결을 위해 CloudWatch Logs를 활성화하려면 어떻게 해야 합니까?를 참조하십시오.

필요한 토큰이 없거나 토큰 검증과 일치하지 않는 경우 Lambda 권한 부여자가 호출되지 않으며 다음과 유사한 로그 메시지가 표시됩니다.

Extended Request Id: MY92nHDwwwIdGxzR=
Unauthorized request: <request-id>

참고: Extended Request Id는 무작위로 생성됩니다. 로그의 ID 값은 다릅니다.

Lambda 권한 부여자가 액세스를 거부하는 정책을 반환하면 로그 메시지는 다음과 비슷합니다.

Sending request to https://lambda.<region>.amazonaws.com/2015-03-31/functions/<lambda-authorizer-arn>/invocations
Authorizer result body before parsing:
{
    "principalId": "user",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Deny",
                "Resource": "<resource-arn>"
            }
        ]
    }
}
Using valid authorizer policy for principal: <principal>
Successfully completed authorizer execution
The client is not authorized to perform this operation.

참고: 반환되는 정책은 Lambda 권한 부여자에 따라 다릅니다.

API Gateway 리소스 정책이 요청을 거부하면 로그 메시지는 다음과 비슷합니다.

Extended Request Id: MY-BIVb4GEdGeZB=
ExplicitDenyException User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny: <request-id>

"Unauthorized" 오류 해결

1.    API Gateway 콘솔에서 Lambda 권한 부여자의 구성을 검토하여 API에 대한 호출에 포함되어야 할 항목을 결정합니다. 자세한 내용은 Amazon API Gateway Lambda 권한 부여자에 대한 입력을 참조하십시오.

참고: Lambda 권한 부여자의 구성을 변경하는 경우 API를 다시 배포하여 변경 사항을 커밋해야 합니다.

2.    API를 다시 호출합니다. 이전 단계에서 콘솔에서 확인한 구성된 토큰 또는 자격 증명 원본을 포함해야 합니다.

자세한 내용은 Lambda 권한 부여자를 생성한 후 API Gateway 401 권한 없음 오류가 발생하는 이유는 무엇입니까?를 참조하십시오.

Lambda 권한 부여자의 "not authorized to access this resource" 오류 해결

이 오류가 간헐적으로 표시되는 경우 정책 캐싱으로 인해 오류가 발생한 것일 수 있습니다. API Gateway 콘솔에서 Lambda 권한 부여자의 구성을 검토하여 권한 부여 캐싱이 활성화되어 있는지 확인합니다. 그런 후 다음 중 하나를 수행합니다.

  • 일회성 테스트의 경우 AWS CLI(AWS 명령줄 인터페이스)에서 flush-stage-authorizers-cache 명령을 실행합니다. 권한 부여자의 캐시 항목이 플러시된 상태에서 API를 다시 호출합니다.
  • 정책 캐싱을 비활성화한 후 API를 다시 호출합니다.
    참고: 요청 파라미터 기반 권한 부여자에 대한 정책 캐싱을 비활성화하면 API Gateway는 Lambda 권한 부여자 함수를 호출하기 전에 API에 대한 호출을 검증하지 않습니다.
  • 토큰 원본(토큰 기반 권한 부여자의 경우) 또는 구성된 자격 증명 원본(요청 파라미터 기반 권한 부여자의 경우)에 지정된 헤더 이름을 업데이트하여 권한 부여자의 캐시 키를 변경합니다. API를 다시 배포하여 변경 사항을 커밋합니다. 그런 다음 새로 구성된 토큰 헤더 또는 자격 증명 원본을 사용하여 API를 다시 호출합니다.

이 오류가 일관되게 표시되는 경우, AWS Lambda에서 Lambda 권한 부여자 함수의 코드를 검토하여 권한 부여자가 호출자에 대한 액세스를 명시적으로 거부하는 이유를 확인합니다.

"not authorized to perform: execute-api:Invoke" e오류 해결

API의 리소스 정책을 검토하여 정책이 잘못되었는지 또는 호출에 대한 액세스를 명시적으로 거부하는지 확인합니다. API의 실행 로그에서 리소스 정책에 대한 응답 결과를 확인할 수 있습니다.

자세한 내용은 Amazon API Gateway에 대한 액세스 정책 언어 개요Lambda 권한 부여자 및 리소스 정책을 참조하십시오.