Amazon Cognito 사용자 풀을 설정한 후 API Gateway REST API 엔드포인트에서 “401 권한 없음(401 Unauthorized)” 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 3월 30일

내 Amazon API Gateway REST API에서 COGNITO_USER_POOLS 권한 부여자로 내 Amazon Cognito 사용자 풀을 설정했습니다. 이제 API 응답에 “401 권한 없음(401 Unauthorized)” 오류가 발생합니다. 이 오류를 해결하려면 어떻게 해야 합니까?

해결 방법

참고: API Gateway는 다양한 이유로 401 권한 없음(401 Unauthorized) 오류를 반환할 수 있습니다. 다음 절차는 COGNITO_USER_POOLS 권한 부여자와 관련된 401 오류를 해결하는 방법을 보여 줍니다.

API 메서드에서 권한 부여자의 구성을 확인합니다.

1.    API Gateway 콘솔의 [API] 창에서 API 이름을 선택합니다.

2.    왼쪽 탐색 창의 API에서 [권한 부여자(Authorizers)]를 선택합니다.

3.    권한 부여자의 구성을 검토하고 다음 사항이 충족되는지 확인합니다.
사용자 풀 ID가 토큰의 발행자와 일치합니다.
API가 배포됩니다.
권한 부여자는 테스트 모드에서 작동합니다.

자세한 내용은 REST API와 Amazon Cognito 사용자 풀 통합을 참조하세요.

참고: API 메서드에서 권한 부여자 구성을 확인한 후 API를 호출 할 수 없는 경우 보안 토큰의 유효성을 확인합니다.

보안 토큰의 유효성을 확인합니다.

자세한 내용은 Amazon Cognito JSON 웹 토큰의 서명을 디코딩하고 확인하려면 어떻게 해야 합니까?를 참조하세요. 보안 토큰의 유효성을 검사할 때 다음 사항이 충족되는지 확인합니다.

  • 보안 토큰이 만료되지 않았습니다.
  • 보안 토큰의 발행자가 API에 구성된 Amazon Cognito 사용자 풀과 일치합니다.
  • ID 토큰액세스 토큰 문자열 값이 유효합니다.
    참고: 문자열 값이 유효한 경우 토큰을 디코딩할 수 있습니다. 토큰이 유효하지 않은 경우 요청 헤더에 전달될 때 토큰에 공백이 추가되지 않았는지 확인합니다.

중요: API Gateway 메서드에 구성된 추가 범위가 없는 경우 유효한 ID 토큰을 사용하고 있는지 확인합니다. API Gateway 메서드에 추가 범위가 구성된 경우 유효한 액세스 토큰을 사용하고 있는지 확인합니다. 자세한 내용은 REST API와 Amazon Cognito 사용자 풀 통합을 참조하세요.

보안 토큰 페이로드 예

Id token payload:
 {
 "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
 "aud": "xxxxxxxxxxxxexample",
 "email_verified": true,
 "token_use": "id",
 "auth_time": 1500009400,
 "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
 "cognito:username": "janedoe",
 "exp": 1500013000,
 "given_name": "Jane",
 "iat": 1500009400,
 "email": "janedoe@example.com"
 }
Access token payload:
{
    "auth_time": 1500009400,
    "exp": 1500013000,
    "iat": 1500009400,
    "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
    "scope": "aws.cognito.signin.user.admin",
    "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "token_use": "access",
    "username": "janedoe@example.com"
}

보안 토큰 페이로드 예에서 다음 클레임 이름을 확인합니다.

  • token_use는 토큰의 유형(ID 또는 액세스 토큰)을 나타냅니다.
  • exp는 토큰의 만료 시간을 나타냅니다.
    참고: exp 클레임은 Unix Epoch(1970-01-01T0:0:0Z) 이후 토큰이 협정 세계시(UTC)로 만료된 날짜와 시간까지 초로 표시됩니다.
  • auth_time은 토큰이 발행된 시기를 나타냅니다.
  • iss는 토큰을 발행한 사용자 풀의 도메인을 나타냅니다.

중요: 사용 중인 토큰이 API Gateway 메서드에 구성된 사용자 풀과 일치하는지 확인합니다. 여전히 API를 호출할 수 없는 경우 권한 부여 헤더를 올바르게 사용하고 있는지 확인합니다.

Postman을 사용하여 API를 호출하는 경우

Oauth 2.0 권한 부여 모드를 통해 Amazon Cognito 토큰을 직접 사용합니다. Oauth 2.0 권한 부여 모드를 설정할 때 다음 사항이 충족되는지 확인합니다.

  • 부여 유형은 사용자 풀의 앱 클라이언트에 대한 구성에 따라 권한 부여 코드 또는 암시적 권한 부여입니다.
  • 콜백 URL은 사용자 풀의 앱 클라이언트에 구성된 리디렉션된 URL과 일치합니다.
  • 권한 부여 URL의 형식은 다음과 같습니다.
https://mydomain.auth.us-east-1.amazoncognito.com/login

중요: mydomain을 사용자 풀을 구성하는 데 사용하는 도메인 이름으로 바꿉니다. API가 호스팅되는 올바른 AWS 리전을 입력해야 합니다.

  • 클라이언트 ID는 사용자 풀의 앱 클라이언트 ID입니다.
    참고: 클라이언트 암호가 사용자 풀의 앱 클라이언트와 연결된 경우 [클라이언트 암호(client secret)] 필드의 [권한 부여(Authorization)] 탭에서 클라이언트 암호를 지정해야 합니다. 사용자 풀의 앱 클라이언트와 연결된 클라이언트 암호가 없는 경우 [클라이언트 암호(client secret)] 필드를 비워 둡니다.
  • 범위openid로 구성됩니다.
    참고: openid 범위는 사용자 풀의 앱 클라이언트에서도 허용되어야 합니다.
  • 권한 부여 코드 흐름에 대해 올바른 Amazon Cognito 사용자 풀 토큰 엔드포인트가 입력되었습니다.

Amazon Cognito 사용자 풀 토큰 엔드포인트 예

https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token

참고: Postman은 필요한 콘텐츠 유형을 토큰 엔드포인트에 전달하지 않아 405 오류가 발생할 수 있습니다. 그러나 암시적 흐름을 사용할 때 504 오류가 나타나지 않습니다.