Amazon Cognito 사용자 풀을 API Gateway REST API의 권한 부여자로 설정하려면 어떻게 해야 하나요?

6분 분량
0

Amazon Cognito 사용자 풀을 내 Amazon API Gateway REST API의 권한 부여자로 설정하고 싶습니다.

간략한 설명

API Gateway REST API에서 Amazon Cognito 사용자 풀을 권한 부여자로 설정하는 방법에는 두 가지가 있습니다.

권한 부여를 위해 ID 토큰 또는 액세스 토큰을 사용할 수 있습니다. 액세스 토큰은 Amazon Cognito에서 사용자 지정 범위를 사용하여 API Gateway API에 대한 액세스 권한을 부여할 수 있습니다. Lambda 권한 부여자는 Amazon Cognito에서 발급한 ID 토큰 및 액세스 토큰의 클레임을 검증할 수 있습니다.

자세한 내용은 다음 주제를 참조하세요.

해결 방법

다음 절차는 COGNITO_USER_POOLS 권한 부여자를 생성하는 방법을 보여줍니다. 이 예에서는 이미 두 가지를 생성했다고 가정합니다.

COGNITO_USER_POOLS 권한 부여자 생성

자세한 내용은 REST API와 Amazon Cognito 사용자 풀 통합을 참조하세요. API Gateway 콘솔을 사용하여 COGNITO_USER_POOLS 권한 부여자 생성 섹션의 지침을 따릅니다.

새 COGNITO_USER_POOLS 권한 부여자 테스트

COGNITO_USER_POOLS 권한 부여자를 생성한 후 다음을 수행합니다.

1.    API Gateway 콘솔에서 새 권한 부여자 아래에 있는 테스트 버튼을 선택합니다.

2.    테스트 창에서 권한 부여에 새 Amazon Cognito 사용자 풀의 ID 토큰을 입력합니다.

3.    테스트를 선택합니다.

참고: ID 토큰이 올바르면 테스트는 200 응답 코드를 반환합니다. 잘못된 ID 토큰은 401 응답 코드를 반환합니다.

API 메서드에서 COGNITO_USER_POOLS 권한 부여자를 구성합니다.

자세한 내용은 REST API와 Amazon Cognito 사용자 풀 통합을 참조하세요. 메서드에 COGNITO_USER_POOLS 권한 부여자 구성 섹션의 지침을 따릅니다.

인증 토큰 받기

인증 토큰을 받는 방법에는 네 가지가 있습니다.

참고: 애플리케이션이 코드를 토큰 엔드포인트로 교환할 수 있도록 권한 부여 코드를 부여할 수 있는 Amazon Cognito 호스팅 UI를 설정하세요.

암시적 권한 부여 유형을 사용하는 경우 콜백 URL에서 부여받을 수 있습니다. 콜백 URL에는 암시적 흐름을 위한 액세스 토큰 및 ID 토큰 파라미터가 추가됩니다. 올바른 토큰 유형을 사용했는지 확인합니다.

Amazon Cognito용 호스팅 UI를 사용하여 인증 토큰 받기

인증 코드 부여 흐름을 사용하려면 다음을 수행합니다.

참고: 인증 코드 부여 흐름을 사용할 때 응답 유형 파라미터는 **"code"**여야 합니다.

1.    인증 코드 부여를 위한 GET 요청을 보냅니다.

중요: example_domain을 사용자 풀의 도메인 이름으로 바꾸세요. example_app_client_id를 사용자 풀의 앱 클라이언트 ID로 바꿉니다. example_callback_url을 콜백 URL로 바꿉니다.

https://example_domain/oauth2/authorize?response_type=code&client_id=example_app_client_id&redirect_uri=example_callback_url

**참고:**페더레이션 ID 공급자로 리디렉션할 엔드포인트의 identity_provider 파라미터를 포함시키세요. 앱 클라이언트가 Amazon Cognito 사용자 풀용으로만 구성된 경우 다음 엔드포인트가 /login 엔드포인트로 리디렉션됩니다.

https://example_domain/login?response_type=code&client_id=example_app_client_id&redirect_uri=example_callback_url

2.    사용자 풀 또는 페더레이션 ID 공급자에 로그인합니다. 사용자 인터페이스가 앱 클라이언트의 콜백에 지정된 URL로 리디렉션됩니다.

중요: 리디렉션 URL에는 유효한 토큰을 얻기 위해 토큰 엔드포인트와 교환해야 하는 인증 코드가 포함되어 있습니다.

3.    /oauth2/token 엔드포인트에 POST 요청을 전송하여 인증 코드를 토큰으로 교환합니다. 자세한 내용은 토큰 엔드포인트를 참조하세요.

인증 코드를 토큰으로 교환하기 위한 POST 요청의 예

참고: 예제 POST 요청은 /oauth2/token 엔드포인트인 **https://example_domain.auth.us-east-1.amazoncognito.com/oauth2/token&**를 사용합니다.

Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic ZXhhbXBsZTEyMzQ1Njc4OTA6enl4OTh3N3l2dHNycTY1NHBvMzIx
grant_type=authorization_code&
client_id=example1234567890&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect

POST 요청 응답 예

HTTP/1.1 200 OK
Content-Type: application/json

{
  "access_token":"abCde1example",
  "id_token":"abCde2example",
  "refresh_token":"abCde3example",
  "token_type":"Bearer",
  "expires_in":3600
}

암시적 부여 흐름을 사용하려면 다음을 수행합니다.

**참고:**암시적 부여 흐름을 사용할 경우 응답 유형 파라미터는 **"token"**이어야 합니다.

1.    암시적 권한 부여를 위한 GET 요청 보내기:

중요: example_domain을 사용자 풀의 도메인 이름으로 바꾸세요. example_app_client_id를 사용자 풀의 앱 클라이언트 ID로 바꿉니다. example_callback_url을 콜백 URL로 바꿉니다.

https://example_domain/oauth2/authorize?response_type=token&client_id=example_app_client_id&redirect_uri=example_callback_url

**참고:**페더레이션 ID 공급자로 리디렉션할 엔드포인트의 identity_provider 파라미터를 포함시키세요. 앱 클라이언트가 Amazon Cognito 사용자 풀용으로만 구성된 경우 다음 엔드포인트가 /login 엔드포인트로 리디렉션됩니다.

https://example_domain/login?response_type=token&client_id=example_app_client_id&redirect_uri=example_callback_url

2.    기존 사용자의 사용자 이름과 암호를 사용하여 사용자 풀에 로그인하거나 로그인할 새 사용자를 생성합니다. 사용자 인터페이스가 앱 클라이언트의 콜백에 지정된 URL로 리디렉션됩니다.

참고: 리디렉션 URL에는 ID 토큰액세스 토큰이 포함됩니다.

리디렉션 URL 예

https://www.example.com/#id_token=123456789idtoken123456789&access_token=123456789accesstoken123456789expires_in=3600&token_type=Bearer

AWS CLI를 사용하여 인증 토큰 받기

참고: AWS CLI 명령을 실행할 때 오류가 발생하면 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

다음 initiate-auth AWS CLI 명령을 실행하여 인증 토큰을 받습니다.

중요: example_user를 사용자 이름으로, example_password를 사용자 비밀번호로, example_app_client_id를 사용자의 앱 클라이언트 ID로 바꾸세요.

aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=example_user,PASSWORD=example_password --client_id example_app_client_id

initiate-auth AWS CLI 명령 응답 예

{
  "AuthenticationResult": {
    "AccessToken": "abCde1example",
    "IdToken": "abCde2example",
    "RefreshToken": "abCde3example",
    "TokenType": "Bearer",
    "ExpiresIn": 3600
  },
  "ChallengeParameters": {}
}

AWS SDK 중 하나를 사용하여 인증 토큰 받기

자세한 내용은 Amazon Cognito를 웹 및 모바일 앱과 통합을 참조하세요.

Postman을 사용하여 인증 토큰 받기

Postman의 OAuth 2.0 권한 부여 모드를 사용하여 인증 토큰을 받으세요. 자세한 내용은 Lambda 권한 부여자를 생성한 후 API Gateway 401 Unauthorized 오류가 발생하는 이유는 무엇인가요?를 참조하세요.

Amazon Cognito 사용자 풀에서 OAuth 2.0 사용자 지정 범위를 구성하고 API Gateway에서 범위를 확인합니다.

범위는 앱이 리소스에 요청할 수 있는 액세스 수준을 제공합니다. Amazon Cognito에는 사용자 풀과 연결된 앱 클라이언트를 허용하도록 구성할 수 있는 OAuth 범위가 내장되어 있습니다. Amazon Cognito의 내장 범위에 대한 자세한 내용은 앱 클라이언트 설정 용어를 참조하세요.

사용자 지정 범위는 OAuth 2.0 리소스 서버에 연결할 수 있습니다. 리소스 서버에 대한 자세한 내용은 사용자 풀의 리소스 서버 정의를 참조하세요.

Amazon Cognito를 API Gateway와 함께 사용하면 Amazon Cognito 권한 부여자가 요청을 인증하고 리소스를 보호합니다. Amazon Cognito 및 API Gateway에서 사용자 지정 범위를 사용하면 API 리소스에 대한 차별화된 수준의 액세스를 제공할 수 있습니다. 또한 리소스를 노출하여 액세스 토큰 범위를 얻을 때 더 많은 제어를 할 수 있습니다.

사용자 풀에 리소스 서버 및 OAuth 2.0 사용자 지정 범위 구성

1.    사용자 풀의 리소스 서버와 사용자 지정 범위를 정의합니다.
리소스 서버 식별자의 경우 리소스가 위치한 API Gateway의 HTTPS 엔드포인트를 입력합니다.

2.    필요한 경우 사용자 풀 앱 클라이언트를 구성한 다음 앱 클라이언트 설정에 사용자 지정 범위를 추가합니다.

참고: 사용자 지정 범위 이름은 resourceServerIdentifier/scopeName 형식으로 지정됩니다.

클라이언트 앱이 OAuth 2.0 흐름에서 사용자 지정 범위를 요청하면 클라이언트 앱이 범위에 대한 전체 식별자를 요청해야 합니다. 예를 들어 리소스 서버 식별자가 https://myresourceserver.example.com이고 범위 이름이 resources.read인 경우 클라이언트 앱은 런타임에 https://myresourceserver.example.com/resources.read를 요청해야 합니다.

API Gateway에서 OAuth 2.0 사용자 지정 범위 확인

1.    REST API를 Amazon Cognito 사용자 풀과 통합합니다.

2.    API Gateway 콘솔에서 REST API를 선택합니다.

3.    리소스 창에서 메서드 이름을 선택합니다.

4.    메서드 요청 구성을 선택합니다.

5.    권한 부여 드롭다운 목록에서 Cognito 권한 부여자를 선택합니다. 그러면 OAuth Scopes라는 새 필드가 자동으로 추가됩니다.

6.    OAuth Scopes 필드에 앞서 언급한 형식으로 사용자 지정 범위의 전체 식별자를 입력합니다. 예를 들어, https://myresourceserver.example.com/resources.read와 같이 입력합니다.

7.    API를 저장하고 배포합니다.

Postman 또는 CURL을 사용하여 설정을 테스트합니다.

1.    클라이언트에 대해 정의된 OAuth 2.0 흐름 중 하나를 사용하여 Amazon Cognito 권한 부여 서버에서 액세스 토큰을 얻습니다.

2.    요청 시 권한 부여 헤더로 받은 수신 액세스 토큰을 API Gateway에 전송합니다.

3.    모든 작업이 성공하고 API Gateway가 액세스 토큰과 사용자 지정 범위를 검증하고 확인하면 200 OK 응답을 받게 됩니다.

관련 정보

Amazon Cognito 페더레이션 ID, Amazon Cognito 사용자 풀 및 Amazon API Gateway를 통한 안전한 API 액세스

Amazon Cognito JSON 웹 토큰의 서명을 디코딩하고 확인하려면 어떻게 해야 하나요?

Amazon Cognito 사용자 풀을 권한 부여자로 사용하여 REST API에 대한 액세스 제어

댓글 없음