본문 바로가기

AWS

Cognito 자격증명풀 사용해보기 (With Nodejs)

Cognito는 AWS 에서 제공하는 서비스이다. 보통 모바일 같은 곳에서 사용자 인증을 할 때 많이 쓴다고 한다.

Cognito 에는 사용자 풀과 자격증명 풀이 존재하며 두개를 따로 사용도 가능하며 동시에 사용도 가능하다.

 

보통 자격증명 풀의 경우 서드파티 또는 AWS의 자격증명을 이용해 Cognito에서 인증을 마치면 자격증명 풀을 이용해 로그인 한 사용자에게 다른 AWS의 리소스에 접근할 수 있는 권한을 줄 때 사용한다.

 

오늘은 NodeJS 에서 Cognito 자격증명 풀을 사용하여 Credential을 얻어오는 간단한 테스트를 해보자

 

우선 자격 증명 풀을 만들어보자.
AWS -> Cognito ->  자격증명 풀 관리를 누르면 기존에 자격증명 풀이 없는 경우 아래와 같이 바로 생성하는 페이지로 넘어간다.

자격증명 풀 생성

  • 자격 증명 풀 이름 : 말 그대로 자격증명 저장소의 이름을 설정
  • 인증되지 않은 자격 증명 : 인증을 거치지 않아도 자격증명(권한)을 부여하여 특정 리소스를 사용할 수 있게 만든다. (인증을 하지 않은 사용자라면 권한도 최소로 주어야 한다. 명심하자)
  • 인증 흐름 설정 : 어떻 방식으로 인증 흐름을 가져갈 지 선택한다. 이번 실습에서는 딱히 신경쓰지 않아도 된다.

 

아래에 어떤 방식을 통해 인증하는지 설정하는게 나오는데, 이번에는 단순 자격증명풀을 사용하는 테스트 이기 때문에 스킵한다.

 

그리고 다음을 누르면 자격증명 풀을 통해 어떤 권한을 부여할지 선택한다.

자격증명 선택

이유는 모르겠으나.... 새 IAM 역할 생성이라면서 기존에 만들어둔 IAM은 생성이 불가능하다. 뭐 나중에 수정하면되니까 그냥 다음을 눌러서 자격증명 풀을 생성해준다.

 

 

이후 Cognito -> 대시보드 -> 자격증명 풀 편집을 통해 이번에 사용할 인증되지 않은 역할에 Administrator IAM을 부여한다.
(나는 테스트 때문에 그냥 Admin 부여했는데 실제로 따라하면 매우매우 큰일난다. 인증되지 않은 사용자기 때문에 조심해야한다.)

cognito-test_role 라는 롤 부여해줌

 

이렇게 수정하고나면 끝이다. 이제 Cognito를 통해 자격증명을 얻는 사용자는 해당 IAM 권한을 가지게 될 것이다.

대충 IAM Role은 아래와 같이 생성해준다.

Role Policy

그럼 바로 적용해보자. 우선 준비물을 NodeJS와 위에 빨간색으로 가린 자격 증명 풀 ID를 복사 해놓는다. 그리고 아래와 같은 간단한 Nodejs 파일을 만들어보자

 

AWS.config.region = 'ap-northeast-2'
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId:'ap-northeast-2:$[자격 증명 풀 ID]'

});


AWS.config.credentials.get(function(){

    // Credentials will be available when this function is called.
    var accessKeyId = AWS.config.credentials.accessKeyId;
    var secretAccessKey = AWS.config.credentials.secretAccessKey;
    var sessionToken = AWS.config.credentials.sessionToken;

    console.log("Access Key :",accessKeyId);
    console.log("Secret Key :",secretAccessKey); 
    console.log("SesstionToken :", sessionToken); 
    
    console.log(AWS.config.credentials);

});

위에  IdentitiyPoolId에 위에 복사한 본인의 자격 증명 풀 ID를 삽입한다. 

그리고 여러가지 키를 얻기 위한 코드도 작성한다. 

위에는 단순 키를 얻기 위한 코드지만 다른게 필요하면 아래의 링크를 참고한다.

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html 

 

그리고 해당 nodejs를 실행하면 짜잔 하고 키가 나오게 된다.

Credential 얻어오기

 

확실한 테스트를 위해 얻어온 Access Key, Secret Key, Session Token을 ~/.aws/credentials 에 저장하고

현재 가지고 있는 identity를 확인 하는 명령어를 쳐보자

내 권한 가져오기

그러면 위와 같이 정상적으로 내가 부여한 Cognito-test_role이 들어온것을 확인할 수 있다.

 

그러면 이걸 어따 써먹을까...?

뭐 보안진단하는 입장에서 React 같은 FE framework를 쓰는데, Source map 또는 뭐 JS 난독화를 풀어서 pool ID를 얻어 내거나, 모바일에서 identity pool id 같은 걸 하드코딩 해놨을 때,  자격 증명 풀 ID 만 있으면 위와 같이 인증받지 않은 사용자에 대한 자격증명도 얻어낼 수 있고, 더 나아가서 로그인 후에 얻은 자격증명을 통해 연결된 Role에 과도한 권한이 설정된 경우 키를 통해 접근해서 정보를 가져올 수 있지 않을까 생각한다. 반박 시 님 말이 맞음....

 

-끝-

'AWS' 카테고리의 다른 글

AWS Codeguru review  (0) 2024.03.03