[AWS] Cognito

고구마양갱·2025년 3월 8일

AWS CLOUD

목록 보기
25/32
post-thumbnail

1. AWS Cognito ?

  회원가입, 인증(2차 인증 포함) 등의 기능을 제공하는 AWS 서비스이다.
Cognito 를 통해 인증에 성공하면, JWT 또는 인증 코드를 생성하여 애플리케이션(웹, 앱)으로 전달한다.
사용자와 애플리케이션은 JWT, 인증코드를 이용하여 인증된 요청, 응답을 주고받는다.

회원가입 정보로 인증하는 것 뿐만아니라, google, facebook, Apple 등 외부 공급자를 통해 인증 받을 수도 있다.

AWS Cognito 의 구성요소에는 User pools 와 Identity pools 가 있다.

1) User pools

  사용자 정보를 담고있는 디렉터리이다. Cognito 를 통해 회원가입한 local 사용자 정보와, 외부 공급자(sns, 구글 등)로 가입(또는 로그인)한 사용자 정보가 저장되어 있다. User pools 에 담긴 사용자 정보를 활용해서 인증을 수행한다.

2) Identity pools

  User pools 의 목적이 사용자 인증이었다면, Identity pools 의 목적은 일시적으로 AWS 서비스 권한을 부여하는 것이다. Identity pools는 Identity를 담고 있는 디렉터리이다.

identity pool 에 저장된 identity 는 아래 3가지에서 가져온다.

- Cognito user pool 에 있는 사용자 정보
- 외부 ID 공급자 (idp = identity provider) Facebook, Google, Apple, or an OIDC or SAML identity provider. 등을 통해 인증받은 사용자 정보
- 상기 두가지 외 별도의 인증 프로세스를 통해 인증받은 사용자 정보

2. AWS Cognito 구성

  비교적 간단한 방법으로 cognito를 테스트 할 것이다.
(물론 퀄리티를 좋게하려면, api gateway에 코딩을 해도 되고, google api 등을 활용해도 좋다. 다만 cognito의 기능에 초점을 맞출 것이므로 테스트에 필요없는 기능은 구현하지 않는다.)

구성 순서는
i) cognito user pool 구성
ii) user pool 을 통한 사용자 인증
iii) cognito identity pool 구성
iv) idendity pool 을 통한 임시 권한 발급 밑 권한 테스트

1) cognito user pool 구성

  identity pool 테스트를 위해 uerl pool이 생성되어 있어야 하므로, user pool 먼저 구성, 테스트 한다.

우측 상단의 create user pool 을 클릭한다.

- application type 은 traditional web application 을 선택 (어차피 애플리케이션에 연결하지 않으니 웹 어플리케이션을 선택해도 상관 없다.)
- name your application 은 user pool 의 이름을 의미한다. 자동으로 구성되나 원하는게 있으면 따로 입력하면 된다.

- Configure options 의 options for sign-in identifiers 는 로그인 식별자를 의미한다. 간단하게 username 으로 지정하자
- required for sign-up 은 회원가입할때 필요한 정보를 지정하는 것이다. 이메일과 이름을 선택한다.

- return url 은 로그인 성공 시 어느 페이지로 리다이렉트할 것인지 설정하는 부분이다. 네이버 주소를 쓰면, 로그인 성공 시 네이버로 이동한다. user pool 에서 사용자 정보를 추가하고 로그인 되는지만 보므로, 굳이 설정할 필요가 없다.
우측 하단의 create user directory 를 선택하면, user pool 이 생성된다.

user pool 생성 완료. identity pool 구성 및 테스트 시 토큰 발급이 필요 하므로, user pool 의 app client에서 관련 설정을 implicit grant 로 바꿔야 한다.

생성한 user pool 을 선택하고

좌측 메뉴 applications 의 app clients 를 선택한다. app client 는 user pool 생성 시 자동으로 생성되며, 필요 시 추가로 생성할 수 있다.
user pool 과 함께 생성된 app client 를 선택한다.

app client 를 선택하면 관련 정보들이 보이고, 하단의 메뉴들 중 Login pages 를 선택한다.
Login pages 는 cognito user pool 에서 기본으로 제공하는 로그인 페이지 설정이다.

중요한 부분인데, 로그인 시 인증 코드가 아닌 인증 토큰을 받아야 하므로, 아래 부분의 oauth2.0 grant types 옵션에서 implicit grant 를 선택하고 디폴트 옵션(code grant)은 지운다.

implicit grant 설정 후 우측 하단의 save changes 를 선택해서 설정을 저장한다.

user pool 설정은 끝나서, 계정 생성 후 로그인이 되는지, 인증 토큰이 발급되는지 테스트하면 된다. 계정 생성 시 패스워드 복잡도가 걸려있어 번거로우니, 패스워드 복잡도 설정을 변경한다.

좌측의 authentication method 메뉴에서 패스워드 복잡도 (password policy)를 설정할 수 있다. password policy 메뉴 왼쪽에 edit 을 선택해서, 복잡도를 수정한다.

실제 서비스에 사용하는 것이라면 패스워도 복잡도를 신경써야 하지만, 간단한 테스트 이므로 한두개 정도는 체크해제해도 된다.
보면 알겠지만, 소문자, 숫자, 대문자, 특수문자 포함 여부, 패스워드 최소 길이 를 설정할 수 있다.

패스워드 복잡도 변경 후 , 실제 사용자를 생성한다. 사용자는 로그인 페이지에서 가입할 수도 있고, user pool 콘솔에서 사용자를 직접 생성할 수 있다. 둘 중에 뭘 선택해도 괜찮으나, user pool 콘솔이 열려 있으니 콘솔에서 사용자를 생성(추가)한다.

user pool 좌측 메뉴의 user 선택 후 우측의 create user 을 선택한다.

첫번째 옵션인 invitation 부분이 보이는데 딱히 필요는 없으니 그냥 놔둔다.
user name , 이메일 주소, 전화번호를 입력하는데 user name 만 필수이고 나머진 선택사항이다. 이메일은 입력이 쉬우나, 전화번호는 형식을 따지므로 맞추기가 쉽지 않다. (그러니까 전화번호는 그냥 두자, 이번 테스트에선 꼭 필요하지 않다.)

마지막 옵션이 임시 패스워드인데 임시 패스워드를 설정하면 처음 로그인 후 패스워드를 변경해야 한다. set password 로 패스워들 설정하고 create user 을 선택하면 사용자가 생성된다.

생성된 사용자를 확인 할 수 있다. 만약 로그인 페이지로 회원가입하면, 별도의 승인을 해야 사용자 로그인 할 수 있다.

2) user pool 사용자 인증

  user pool 구성, 사용자 생성했으니 로그인을 해보고, 토큰이 생성되는지 확인하면 된다.

로그인 페이지는 app client 의 우측 상단에 view login page 를 클릭해 접속 할 수 있다.

username을 입력하고 next 선택

방금 설정한 임시 패스워드를 입력하고 continue 선택

그러면 임시 패스워드를 변경하라고 나오고, 패스워드를 변경, name 을 입력한다.
name 은 생성한 사용자의 username 을 입력하면 된다.

그 후 다시 로그인 페이지를 띄워서 username , password 를 입력하면 로그인 할 수 있다.

로그인에 성공하면, 위의 페이지가 나오고 다른 페이지를 띄울 수도 있다.
다른 페이지를 띄우고 싶다면 call back url 을 다른 url 로 설정하면 된다.

url 을 보면 id_token 값이 보인다. identity pool 에서 이 id_token 값을 활용해
aws 서비스에 대한 임시 권한을 발급받고, 이 임시 권한으로 aws 서비스를 사용해 볼 것이다.

appclient 의 login page 설정에서 oauth2.0 옵션을 code grant 로 설정하면, token 이 아니라. url 에 code 가 발급되므로 참고하자.

3) identity pool 구성

  user pool 생성 및 사용자 추가, 로그인까지 했으니, identity pool을 생성하고 테스트한다. cognito 에서 identity pool 선택한다.

우측의 create idnetity pool을 선택

옵션이 여러개 있는데, 인증 대상에게 임시 권한을 부여하므로 ,
user access 에는 Authenticated access 를 선택한다.
Authenticated identity access 옵션은 어떤 방식으로 인증된 정보를 활용할 것인지 정하는 것이다. user pool의 사용자 정보를 활용할 것이므로, amazon cognito user pool을 선택하고 우측 하단의 next 로 넘어간다.

임시 권한 발급 시 어떤 aws 서비스의 권한을 줄것인지 지정하는 부분이다.
새로 만들 것이므로 create a new IAM role 을 선택하고, 바로 아래의 role name 을 입력한다. 그리고 우측 하단의 next 선택

identity 를 user pool 에서 사용하는 것으로 설정했으니, 당연 생성한 user pool, app client 를 선택한다. role settings 에는 user default authenticated role 을 선택한다. 디폴트 옵션은 방금 생성한 iam role 을 가리키게 되어 있다.

하단에 claim mapping 옵션이 있는데 매우 중요한 옵션이다. 옵션의 값은 inactive 를 선택한다. 만약 다른 옵션을 선택하면 마지막 테스트 시 accesskey, scretkey 를 얻을 수 없으므로 반드시 inactive 를 선택한다.

identity pool name 을 입력하고 basic classic authentication 의 옵션은 체크하지 않는다. 그리고 next 선택

설정한 옵션들을 확인하고, 우측 하단의 create identity pool 을 선택해서, identity pool 을 선택한다.

identity pool 생성은 했으나, 임시 권한에 대한 추가설정이 필요하다. 간단하게 s3 읽기 권한을 부여하여, 임시 권한을 받은 사용자가 s3 bucket 과 파일을 조회할 수 있게 한다.
이를 위해 이전 단계에서 생성한 iam role 의 권한을 변경해야 한다.

생성한 identity pool 을 선택, 아래 user access 메뉴에서 하단 중앙에 이전 단계에서 생성한 iam role (authenticated role 부분 바로 아래)의 이름을 확인할 수 있다. 이 이름을 클릭 하면 iam role 설정화면으로 이동한다.

임시 권한 설정에서 s3 read 권한을 추가할 것이다. 우측 add permission > attach policies를 선택하면 권한을 추가할 수 있다.

s3 read 권한 검색, 체크 후 우측 하단의 add permissions 를 눌러 추가

identity pool 임시 권한에 s3 읽기 권한 추가 완료

이 부분도 중요한데, identity pool 에 부여한 role 의 trust relationship 설정은, role 과 identity pool의 관계를 보여준다. identity pool 생성시 role을 새로 만들었으므로 확인할 필요는 없다. 그러나 이미 생성된 role 을 identity pool의 임시권한으로 설정 할 수 있다.

이런 경우 role 의 trust relationship 부분 cognito-identity.amazonaws.com:aud 로 설정된 값이, 연결해야 하는 identity pool의 id 와 동일한지 확인해야한다.

만약 다르다면 임시 권한 부여에 문제가 생긴다. (accesskey, secretkey 발급에 문제가 될 수 있다.)

추가로 cognito-identity.amazonaws.com:amr 부분이 authenticated 로 설정되어 있어야 한다.

4) identity pool 임시권한 발급, 테스트

이제 user pool 의 id token 으로 임시 권한을 받아, aws 서비스에 접근할 것이다.
이번 테스트에서는 s3 read 권한을 임시 권한으로 부여했으므로, s3 조회해볼 것이다.

i) 최종 테스트 전 체크해야 할 것들

- user pool 생성 시 code grant 가 아닌 implicit grant로 설정했는지 ?
- identity pool 생성 시 claim 부분을 비활성화 했는지 ?
- identity pool 생성 시 같이 만든 role 의 trust 부분 identity pool 의 id 와 동일하고 authenticated 로 되어 있는지 ?

상기 3가지를 체크했으면, 테스트는 문제없이 수행될 것이다.

user pool 로그인 페이지에서 로그인 후 브라우저 url 부분의 id token, access token을 확인한다.

로그인으로 얻은 id_token 을 디코딩 해보면, user pool에서 생성한 사용자 정보를 얻을 수 있다.

임시 권한을 발급을 위해 aws cli 를 설치하고, cmd 에서 몇가지 명령어를 사용한다.

우선 identityid 를 얻기 위해 아래의 명령어를 실행한다.

aws --region [region name] cognito-identity get-id --identity-pool-id [identity pool id] --logins cognito-idp.[region name].amazonaws.com/[user pool id]=[id_token]

앞에 --region 옵션을 준 이유는 aws cli 실행 시 리전을 설정해달라는 메시지가 나올 수 있기 때문이다. 그래서 사전에 리전 옵션을 미리 준다.

명령어를 실행하면 identityid 를 얻을 수 있다.
얻어낸 identityid 를 활용해 accesskey, secretkey, sessiontoken 을 구한다.
이 세가지는 임시 권한을 발급받는데 필요하다.

사용할 명령어는

aws --region [region name] cognito-identity get-credentials-for-identity
--identity-id [identity-id] --logins cognito-idp.[region name].amazonaws.com/[user-pool-id]=[id-token]

이다

명령어를 실행하면, accesskey, secretkey, sessiontoken 을 확인할 수 있다.
그리고 이 세가지 값을 aws cli 에서 설정하면, 임시 권한을 얻을 수 있다.

실행 명령어는
aws configure 입력 후

AWS Access Key ID [none] : [accesskey 입력]
AWS Secret Access Key [none] : [secretkey 입력]
그리고 region 을 입력하고 format 은 입력할 필요 없다.

sessiontoken 까지 설정해야 임시 권한을 얻을 수 있다. 명령어는

aws configure set aws_session_token [session token]

을 사용한다.

accesskey, secretkey, session token을 설정하면 임시 권한을 얻은 것이므로, 이 상태에서 s3 의 bucket, 파일 리스트를 확인할 수 있다. 위 사진을 보면 s3 명령어로 bucket명, 파일명이 조회되는 것을 확인할 수 있다.

테스트를 완료 했으면, aws cli 에 설정한 accesskey, secretkey, sessiontoken 등을 삭제하는게 좋다. 테스트 용도이며, user pool , identity pool 을 삭제한다고 해도 인증 관련된 key, token 이 남아있는 것은 찝찝하다.

관련 인증키, 토큰이 저장된 파일의 위치는 대부분 c:\사용자\pc명.aws 경로에 위치한다.
파일명은 credentials 이니 이 파일을 삭제하면 된다.

cli 에서 dir 을 하면 바로 .aws 디렉터리가 보인다.

.aws 디렉터리로 가서 credentials 파일을 삭제한다.

3. 유의 사항

1) user pool 구성 시

app client 의 OAuth 2.0 grant types 을 Implicit grant 로 해야
code 가 아닌 token 값을 받을 수 있음

2) identity pool 구성 시

iam role 의 trust relationship 부분 identity pool id 와 일치
Attributes for access control 의 claim 부분 비활성화 해야 aws cli 에서 명령어 실행해서 credential 받아올 수 있음
Basic (classic) authentication 옵션은 체크 하나 하지 않으나 관계없음

3) 임시권한 발급 시

aws cli 에서 권한 얻을 시
accesskey, secretkey 뿐만 아니라 session_token 도 설정해야 권한 받을 수 있음
명령어는 aws configure set aws_session_token [session token 값]
accesskey, secretkey 는 처음에 aws configure 사용시 입력해도 되고
aws configure set 명령어로도 설정 가능함

4. 참고 자료

https://medium.com/@shivkaundal/step-by-step-guide-to-setting-up-aws-cognito-identity-pools-for-federated-identity-access-to-aws-2ca83a87d986

0개의 댓글