AWS AppSync에서 GraphQL 요청을 실행할 때 발생하는 “권한 없음” 오류를 해결하려면 어떻게 해야 합니까?
AWS AppSync에서 GraphQL 요청을 실행할 때 “권한 없음” 오류를 수신합니다.
간략한 설명
응답에서 반환된 HTTP 상태 코드에 의해 정의되는 권한 없음 오류에는 두 가지 유형이 있습니다.
- 401 권한 없음: 자격 증명이 없거나 유효하지 않기 때문에 AWS AppSync 또는 권한 부여 모드에서 요청이 거부되었습니다.
- 권한 없음 유형 오류가 있는 200 OK 응답: 해석기 수준 이상의 문제로 인해 요청이 거부되었습니다.
권한 없음 오류의 원인을 확인하려면 웹 브라우저에서 문제를 재현해 봅니다. 그런 다음, 브라우저의 네트워크 도구를 사용하여 HTTP 요청 및 응답 메시지를 캡처합니다. 메시지를 분석하여 오류가 발생한 위치를 파악합니다. 오프라인으로 분석하려면 HTTP 아카이브(HAR) 파일에 메시지를 저장합니다.
해결 방법
401 권한 없음 응답
401 권한 없음 응답의 경우 GraphQL 페이로드를 전송하는 네트워크 요청을 검사하여 다음을 확인하십시오.
- Authorization 또는 x-api-key 헤더가 있으며 작업 또는 필드에 필요한 권한 부여 모드에 대한 올바른 자격 증명을 포함합니다. 헤더에 올바른 자격 증명이 없는 경우 권한 부여 모드에서 요청을 거부합니다.
- JSON 웹 토큰(JWT)에 대해서는 GitHub 웹사이트의 "Bearer"라는 텍스트가 포함되지 않는 권한 부여 헤더를 참조하십시오.
- JWT는 올바른 Amazon Cognito 사용자 풀 또는 OpenID Connect(OIDC) 공급자로부터 제공됩니다.
- 자격 증명이 유효하며 만료되지 않았습니다.
200 OK 응답
200 OK 응답에 대한 권한 없음 오류의 원인에 대한 자세한 내용을 보려면 AWS AppSync API에서 Amazon CloudWatch 로그를 켜십시오. 필드 수준 로깅을 모두로 설정하고 자세한 내용을 포함하는 것이 가장 좋습니다.
권한 없음 오류 유형 및 Not Authorized to access X on type Y라는 메시지와 함께 200 OK 응답을 받은 요청은 Apache Velocity Template Language(VTL) 해석기 매핑 템플릿의 로직에 따라 거부됩니다. 이 문제를 해결하려면 사용 중인 권한 부여 모드에 대한 다음 문제 해결 단계를 완료하십시오.
Amazon Cognito 및 OIDC 권한 부여
그룹, email_verified 및 클라이언트 ID 또는 대상 등과 같은 사용자의 토큰 클레임을 VTL 해석기 매핑 템플릿의 권한 부여 검사와 비교합니다. AuthO 웹 사이트의 타사 도구 jwt.io를 사용하면 토큰 클레임을 확인할 수 있습니다. 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를 사용하는 경우 스키마에 대한 권한 부여 규칙이 생성, 읽기, 업데이트 또는 삭제 작업을 허용하는지 확인하십시오. 자세한 내용은 Amplify Docs 웹사이트에서 ](https://docs.amplify.aws/cli/graphql/authorization-rules/)권한 부여 규칙 사용자 지정[을 참조하십시오.
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-1 및 field-2를 원하는 필드로 바꾸십시오.
Amplify를 사용하여 해석기 매핑 템플릿을 생성하는 경우에는 다음을 확인하십시오.
- IAM 자격 증명이 발급된 역할 세션 이름이 CognitoIdentityCredentials와 동일합니다.
- IAM 자격 증명이 Amplify에서 생성하는 auth 또는 unauth 역할과 동일합니다.
역할 세션 이름이 문자열과 일치하지 않으면 필드 또는 작업에 대한 액세스가 거부됩니다.
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 스키마에는 지시문이 없습니다.

관련 콘텐츠
- 질문됨 2년 전lg...
- 질문됨 일 년 전lg...
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 2년 전