AWS AppSync에서 GraphQL 요청을 실행할 때 "무단" 오류를 해결하려면 어떻게 해야 합니까?

4분 분량
0

AWS AppSync에서 GraphQL 요청을 실행할 때 "무단" 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 하나요?

간략한 설명

응답에서 반환되는 HTTP 상태 코드에 의해 정의되는 승인되지 않은 오류에는 두 가지 유형이 있습니다.

  • 401 Unauthorized: 보안 인증이 없거나 유효하지 않아서 AWS AppSync 또는 권한 부여 모드에서 요청을 거부했습니다.
  • 200 OK 응답 (Unauthorized 유형) 오류: 해결자 수준 이상의 문제로 인해 요청이 거부되었습니다.

무단 오류의 원인을 확인하려면 웹 브라우저에서 문제를 재현해 보십시오. 그런 다음 브라우저의 네트워크 도구를 사용하여 HTTP 요청 및 응답 메시지를 캡처합니다. 메시지를 분석하여 오류가 발생한 위치를 확인합니다. 오프라인 분석을 수행하려면 이 메시지를 HTTP 아카이브(HAR) 파일에 저장합니다.

해결 방법

401 Unauthorized 응답

401 Unauthorized 응답의 경우 GraphQL 페이로드를 전송하는 네트워크 요청을 확인하여 다음을 확인합니다.

  • Authorization 또는 x-api-key 헤더가 있으며 작업 또는 필드에 필요한 인증 모드에 대한 올바른 보안 인증이 포함되어 있습니다. 헤더에 올바른 보안 인증이 없는 경우 승인 모드는 요청을 거부합니다.
  • JSON 웹 토큰(JWT) 의 경우 인증 헤더에는 “베어러” 텍스트가 포함되어 있지 않습니다(GitHub 웹사이트 출처).
  • JWT는 올바른 Amazon Cognito 사용자 풀 또는 OIDC 공급자에서 가져온 것입니다.
  • 보안 인증이 유효하며 만료되지 않았습니다.

200 OK 응답

무단 오류가 200 OK 응답에 대하여 발생하는 원인에 대하여 자세한 내용을 보려면 AWS AppSync API에서 Amazon CloudWatch Logs를 활성화하십시오. 문제 해결을 위한 모범 사례로 필드 수준 로깅을 전체로 설정하고 상세한 내용을 포함시킵니다.

200 OK 응답 수신 시 오류 유형 무단Not Authorized to access X on type Y 메시지가 발생하는 요청은 Apache Velocity Template Language(VTL) 확인자 매핑 템플릿 내 논리에 의해 거부됩니다. 이 문제를 해결하려면 사용하는 인증 모드에 대해 다음 문제 해결 단계를 완료하십시오.

Amazon Cognito 및 OIDC 승인

그룹, email_verified, 클라이언트 ID 또는 대상 등의 사용자 토큰 클레임을, VTL 확인자 매핑 템플릿의 권한 부여 검사와 비교합니다. 타사 도구인 jwt.io(AuthO에서)를 사용하여 토큰 클레임을 확인할 수 있습니다. AWS Amplify를 사용하는 경우, 토큰 클레임이 모델 스키마 유형에 대한 권한 부여 규칙 요구 사항을 지원하는지 확인합니다.

예를 들어 다음 Amplify용 확인자 매핑 템플릿은, AWS AppSync가 수행하는 예비 권한 부여 검사에서 전달된 데이터를 확인합니다.

#if( $util.authType() == "User Pool Authorization" )
  #if( !$isAuthorized )
    #set( $staticGroupRoles = [{"claim":"cognito:groups","entity":"Admin","allowedFields":xxxxx,yyyyy}] )
    #foreach( $groupRole in $staticGroupRoles )
      #set( $groupsInToken = $util.defaultIfNull($ctx.identity.claims.get($groupRole.claim), []) )
      #if( $groupsInToken.contains($groupRole.entity) )
        #if( $groupRole.isAuthorizedOnAllFields )
          #set( $isAuthorized = true )
          #break
        #else
          $util.qr($allowedFields.addAll($groupRole.allowedFields))
        #end
      #end
    #end
  #end
#end

또한 Amplify를 사용하는 경우 스키마의 권한 부여 규칙이 만들기, 읽기, 업데이트 또는 삭제 작업을 허용하는지 확인합니다.

IAM 권한 부여

AWS AppSync에 요청을 서명하는 AWS Identity and Access Management(IAM) 사용자 또는 역할에 적용되는 정책을 검토합니다. 사용자가 액세스하는 각 필드에 대하여, appsync:GraphQL작업 블록에 부여되는지 확인합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "appsync:GraphQL"
      ],
      "Resource": [
        "arn:aws:appsync:us-east-1:111122223333:apis/graphql-api-id/types/Query/fields/field-1",
        "arn:aws:appsync:us-east-1:111122223333:apis/graphql-api-id/types/Mutation/fields/field-2"
      ]
    }
  ]
}

참고: graphql-api-id를 GraphQL API의 ID와, field-1field-2(필드에 속함)로 교체합니다.

Amplify를 사용하여 확인자 매핑 템플릿을 생성하는 경우 다음을 확인합니다.

  • IAM 보안 인증이 발급되는 역할 세션 이름은 CognitoIdentityCredentials과 동일합니다.
  • IAM 보안 인증은 Amplify가 생성하는 인증 또는 비인증 역할과 동일합니다.

역할 세션 이름이 문자열과 일치하지 않으면 필드 또는 작업에 대한 액세스가 거부됩니다.

Lambda 권한 부여

  • isAuthorized가 발행된 Lambda 함수 코드에서 작성한 사용자 지정 로직을 확인하여 true로 설정되어 있는지 확인합니다.
  • deniedFields 배열에 요청된 필드 또는 연산이 포함되어 있지 않은지 확인합니다.
  • CloudWatch 로그를 확인하거나 디버깅 문을 추가하여 사용자 권한 부여를 결정하는 논리 흐름을 확인합니다.

여러 권한 부여 모드 사용

AWS AppSync API에 여러 권한 부여 모드가 있는 경우 API는 설정된 기본 권한 부여 모드를 사용합니다. 다른 권한 부여 모드 중 하나가 필요한 유형이나 필드의 경우 해당 모드에 대한 권한 부여 지시문도 설정해야 합니다. 자세한 내용은 AWS AppSync GraphQL API에서 여러 권한 부여 유형 사용을 참조하십시오.

예를 들어 AWS AppSync API에는 기본 권한 부여 모드로 설정된 API_KEY가 있고, 추가 권한 부여 모드로 AMAZON_COGNITO_USER_POOLS가 있습니다. 두 모드를 모두 사용하려면 @aws_api_key@aws_cognito_user_pools 권한 부여 지시문을 설정해야 합니다.

type Post @aws_api_key @aws_cognito_user_pools {
 id: ID!
 author: String
 title: String
}

참고: 기본API_KEY 인증 모드는 다음과 같은 이유로 요청을 거부합니다.

  • 요청 헤더에서 Amazon Cognito JWT가 전송됩니다.
  • GraphQL 스키마에서 디렉티브가 누락되었습니다.

AWS 공식
AWS 공식업데이트됨 2년 전