2017년 6월 8일 목요일

[AWS] AWS Cognito Federated Identities 시작하기

AWS Cognito Federated Identities 시작하기

(부제 : 자바스크립트에서 AWS 서비스에 접근하기 위한 AWS Credentials 획득방법)

웹브라우저에서, AWS의 Javascript SDK를 이용해서 AWS의 서비스(ex. S3)에 접근하려면 당연히 권한이 있는지 인증을 해야하는데, 그 한가지 방법이 Federated Identities를 이용하여 Credentials을 획득해서 이용하는 것입니다.
Federated Identities에서는 다양한 Identity Provider를 지원하는데, AWS Cognito UserPool도 한가지 Provider로 제공되고 있습니다.
이번 포스팅에서는 AWS Cognito UserPool을 Identity Provider로 선택한 상태에서, 해당 Cognito UserPool에 가입된 계정으로 로그인해서 Credentials을 획득하는 과정을 정리해보겠습니다.

0. 순서

  1. Federated Identities에서 Identity Pool 준비하기
  2. Cognito UserPool에 가입된 게정으로 로그인해서 Credentials 획득하기
단계를 잘게 쪼개려 했는데, 그러면 쓸데없이 맥이 끊길거 같아서 2개 단계로만 나눴습니다.

1. Federated Identities에서 Identity Pool 준비하기

AWS Cognito는 User Pool과 Identity Pool, 2개의 서비스로 나눠진다고 볼 수 있습니다.
User Pool은 회원 정보들의 저장소를 제공하는 서비스이고, Identity Pool은 Facebook, Google, Twitter 등 외부 서비스의 계정으로 로그인 할 수 있게 해주면서, AWS 서비스에 접근할 수 있는 Credentials을 생성해주는 서비스라고 할 수 있습니다.
물론 Identity Pool에서는 User Pool도 Identity Provider로 사용할 수 있습니다.
이제 Step by Step으로 진행해보겠습니다.
AWS Cognito 서비스에 접속합니다.

첫 화면에서 Manage Federated Identities를 선택합니다.
새로 생성하는 것이기 때문에 Create new identity pool을 선택합니다.
그럼 아래 화면처럼 Identity Pool을 설정하는 화면이 나타납니다.

Identity pool name에는 본인이 원하는 이름으로 넣어주시면 됩니다.
Unauthenticated identities는 로그인 하지 않은 사용자에게도 AWS 서비스에 접근할 수 있는 Credentials을 발급해주겠다는 것입니다. 즉, 익명 사용자를 허용하는 것입니다. 허용하려면 Enable access to unauthenticated identities 체크박스에 체크를 하시면 됩니다.
Authentication providers가 로그인 기능의 제공자입니다.
Facebook, Google 등이 있지만 여기서는 Cognito를 선택하겠습니다.
Cognito의 User Pool을 로그인 기능 제공자로 사용하려면 User Pool의 ID와 App Client ID를 입력해야합니다.
(UserPool에 대한 정보는 다음의 링크에서 확인하시면 좋습니다. https://walkinpcm.blogspot.kr/2017/05/aws-aws-cognito.html)
입력을 마치고 Create Pool을 선택하면 다음 화면으로, Role에 대한 설정화면이 나타납니다.

여기서 설정하는 Role이 어떤 것이냐면, 지금 생성하는 Identity Pool을 이용해서 Credentials을 획득한 사용자에게 어떤 AWS 서비스에 대한 제어권을 허용할지 정하는 Role 설정입니다.
당연히 모든 AWS 서비스를 개방해주면 보안 측면에서 좋지 않을 것입니다.
위의 화면을 보시면 2개의 Role을 만들게 되는데 하나는 Unauthenticated Identities에 대한 Role이고(익명 사용자), 다른 하나는 Authenticated Identities에 대한 Role(로그인 한 사용자)입니다.
AWS IAM에서 미리 적절한 Role을 생성하셨다면 해당 Role을 선택하시면 되고, 준비된 Role이 없으시면 본 화면의 기본설정을 그대로 둬서 새로운 Role을 생성하시면 됩니다.
여기서 새로 생성한 Role은 이름만 지정된 빈껍데기니깐 IAM가셔서 빈껍데기 Role에 허용하실 AWS 서비스에 대한 Policy를 추가하셔야합니다.
(실제론 정말 빈껍데기는 아니고 cognito관련 policy가 있기하지만 여기서는 관련 없으니 빈껍데기라고 표현했습니다.)
Allow를 클릭하시면 Identity Pool 생성이 완료됩니다~

2. Cognito UserPool에 가입된 계정으로 로그인해서 Credentials 획득하기

Identity Pool이 생성이 되고나면 자바스크립트 코드에서 Credentials을 획득 할 수 있습니다.
Identity Provider를 Cognito UserPool로 했기 때문에 Cognito의 signin 함수 내에서 로그인에 성공했을 때 credential을 획득할 수 있습니다.
signin 함수에 대해서는 https://walkinpcm.blogspot.kr/2017/05/aws-aws-cognito.html 에서 자세히 보실 수 있습니다.
signin 함수에서 로그인 요청하는 부분의 코드를 보면서 설명하겠습니다.
var cognitoSignedUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);

// authenticateUser() 함수가 cognito에 로그인을 요청하는 함수입니다.
cognitoSignedUser.authenticateUser(authenticationDetails, {
  // 로그인 성공시 onSuccess함수가 호출되며, 토큰 정보 등을 가지고 있는 result 변수를 전달합니다.
  onSuccess: function (result) {
    // credentials을 가져오기 전 리전 정보를 설정합니다.
    AWS.config.update({
      region: 'YOUR_REGION',
    });
    
    // credentials를 가져오기 위해 필요한 정보들을 입력합니다.
    // <> 안을 자신의 정보로 대체하여 입력합니다.
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: '<YOUR_IDENTITY_POOL_ID>',
      Logins: {
          'cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>': result.getIdToken().getJwtToken()
      }
    });

    // get() 함수로 credentials을 획득합니다.
    AWS.config.credentials.get(function(err){
      if (err) {
          alert(err);
      }
    });
  },
  // 로그인 실패시 에러메세지 출력
  onFailure: function(err) {
    alert(err);
  }
});
위와 같이 AWS.config.credentials에 credentials을 획득할 수 있습니다.
웹브라우저에서 credentials을 획득하고 나면 이걸 가지고 AWS 서비스에 접근할 수 있는데, 다음 포스팅에서 credentials을 이용하여 AWS S3에 사진을 올리고 읽어오고 삭제하는 등 포토앨범을 만드는 예제를 정리해보겠습니다.

연결되는 포스팅

AWS S3를 이용해서 웹브라우저에서 사용할 수 있는 포토 앨범 만들기

참고 링크

댓글 없음:

댓글 쓰기