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

최종 업데이트 날짜: 2021년 5월 18일

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

간략한 설명

참고: API Gateway는 다양한 이유로 403 Forbidden 오류를 반환할 수 있습니다. 이 문서에서는 REST API 전용으로 구성된 Lambda 권한 부여자와 관련된 403 오류를 해결합니다. 다른 유형의 403 오류 문제 해결에 대한 자세한 내용은 API Gateway의 HTTP 403 Forbidden 오류를 해결하려면 어떻게 해야 합니까?를 참조하세요.

Lambda 권한 부여자가 있는 API Gateway REST API에서 403 오류를 반환하는 데는 일반적으로 2가지 이유가 있습니다.

API 호출에 토큰 또는 ID 소스가 누락되었거나, null이거나, 검증되지 않은 경우 401 권한 없음 오류가 표시됩니다. 자세한 내용은 Lambda 권한 부여자를 생성한 후 API Gateway 401 권한 없음 오류가 발생하는 이유는 무엇입니까?를 참조하세요.

해결 방법

오류 원인 확인

참고: 아직 이를 수행하지 않은 경우 API Gateway REST API에 대한 CloudWatch Logs를 켭니다.

1.    API Gateway의 응답에서 오류 메시지를 검토합니다. 다음 중 하나와 유사한 오류 메시지를 찾습니다.

명시적 거부가 포함된 IAM 정책 문서를 반환하는 Lambda 권한 부여자 함수에 대한 오류 메시지 예시

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

호출자에 대한 액세스를 묵시적으로 거부하는 연결된 리소스 정책이 있는 REST API에 대한 오류 메시지 예시

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

호출자에 대한 액세스를 명시적으로 거부하는 연결된 리소스 정책이 있는 REST API에 대한 오류 메시지 예시

{
    "message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny"
}

참고: API Gateway API에 대한 액세스가 IAM 정책에 의해 제어될 때의 결과 동작에 대한 자세한 내용은 정책 평가 결과를 참조하세요.

2.    CloudWatch에서 API Gateway 실행 로그를 확인하고 인증 워크플로를 검토합니다. Lambda 권한 부여자의 출력API Gateway의 리소스 정책 평가 결과를 볼 수 있습니다. 또한 다음 중 하나와 유사한 로그 오류 메시지가 나타납니다.

필수 토큰이 없거나 토큰 유효성 검사와 일치하지 않는 경우의 로그 오류 메시지 예시

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

참고: 확장 요청 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>

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

간헐적으로 나타나는 not authorized to access this resource 오류는 정책 캐싱으로 인해 발생하는 것일 수 있습니다. 권한 부여 캐싱(Authorization Caching)이 활성화되어 있는지 확인하려면 API Gateway 콘솔에서 Lambda 권한 부여자의 구성을 검토합니다. 이어서, 다음 중 하나를 수행합니다.

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

오류가 지속적으로 표시되는 경우 Lambda 권한 부여 함수의 코드를 검토하여 권한 부여자가 호출자에 대한 액세스를 명시적으로 거부하는 이유를 확인합니다. 그런 다음 호출자에게 액세스할 수 있도록 코드를 업데이트하세요.

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

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

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