AWS Cognito (1) - 사용자관리/OAuth 2.0
<개요>
- 대부분의 서비스에서 공통적으로 필요한 기능이 사용자 관리/로그인 기능이다. 단순한 것 같지만 생각보다 많은 리소스가 필요한 시스템이다. (특히 권한연계까지 들어갈 경우)
- 기존에는 자체적으로 사용자 관리 시스템을 운영하고 있었다. (Password Grant방식)
그 이유는 특별한 사용자의 정보를 담지 않고 있으며 인증, Resource Server, Client가 모두 같은 System Boundary에 포함되어 있었기 때문에 가장 간편한 방식으로 개발하였다.
- 이제부터는 관리기능을 확장시키고 추가 정보를 담아야 하는 요건이 생겼으며, 이를 위해서 사용자 인증에 관련된 부분을 별도 시스템으로 분리하여 구성하는 것이 좋다고 판단하였다.
- AWS Cognito의 경우 외부연동, MFA인증등 편리한 기능을 기본적으로 가지고 있으며 JWT Token, IAM 연동도 가능한 것으로 보여서 가능성을 검토해본다.
a. 기존 시스템을 유지하면서 개선할 것인지 (Spring Boot / Security / JWT Token)
b. 새로 개발할 것인지 (e.g AWS Cognito)
c. 혹은 a,b를 혼합하여 가져갈 수 있을지 (커스터마이징의 범위)
<내용>
1. 사용자 풀
- 사용자를 생성하고 그룹을 할당할 수 있다.
- 이메일 확인 및 비밀번호 초기화 등의 기능을 기본으로 제공한다.
- 그룹은 개별적으로 추가 가능하다.
- AWS Cognito user pool은 기본적으로 대소문자를 구분하지 않도록 되어있다. (권장사항)
만약에 대소문자를 구별하고 싶다면 Make user name case sensitive 옵션을 활성화 해야한다.
https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-case-sensitivity.html
2. 연동자격증명 공급자
- 우리가 SNS연동을 하기 위해서는 일반적으로 App을 생성하고 할당받은 Client ID, Secret을 이용하여 API호출 및 연계개발을 하게 되는데 이부분이 쉽게 설정으로 가능하도록 되어있다. (많이 사용하는 Google / Apple / Facebook)
- 그 외에도 표준 OIDC를 준수한다면 쉽게 추가하고 속성을 매핑할 수 있는 구조로 되어있다.
3. SMS / SNS
- 스타트업에서는 내부에 문자 / 이메일 발송기능이 없는 경우도 많은데 AWS SES / SNS 등과 쉽게 연동하여 활용이 가능하다.
- 단, SMS는 현재 도쿄 리전에서만 사용이 가능하며 샌드박스 내에서는 등록된 번호로만 발신이 가능하다.
4. App 구성
- AWS Cognito도 결국 우리가 만든 서비스와 연결되기 위해서 여러가지 요소가 필요한데 이에 대한 부분도 제공하고 있다.
- 도메인 : Cognito 도메인 or 사용자 지정도메인 가능
- 리소스 서버 구성 (OAuth 2.0)
- 호스팅 UI, 앱 클라이언트
5. OAuth 2.0
- 앱 유형을 선택하기 전에 OAuth 2.0에 대한 기본적인 이해도가 있으면 도움이 된다.
https://icthuman.tistory.com/entry/OAuth-20-Flow
6. 앱 클라이언트
- 앱 클아이언트 부분을 좀 더 자세히 살펴보면 다음과 같다.
- 클라이언트 보안키 생성유무 선택에 따라서 추후 토큰발급 엔드포인트를 호출할 때 방법에 차이가 있다.
- 세션, 토큰( Id/Access/Refresh )별 만료시간을 선택할 수 있으며 Revoke Token에 대해서 선택사항으로 정할 수 있다.
- 사용자를 찾을 수 없다고 응답을 하면 해킹에 취약해질 수 있기 때문에 최근 로그인 시스템에서는 이름 또는 암호가 잘못되었다고 묶어서 표현하고 있다.
6. 호스팅 UI
- 자체적으로 로그인 UI 를 제공해준다.
- 주의할 점은 사용자 풀에서 연동자격증명을 선택하였다면 여기서도 선택을 해주어야 UI 상에서 버튼이 활성화 된다.
- 해당 호스팅UI는 내가 등록한 App에서만 사용하는 것이다. 따라서 호출할 때 다음 파라미터들을 전달해주어야 정상적으로 동작한다.
- client_id, response_type, scope, redirect_uri
<정리>
- AWS Cognito에서 User Pool을 생성하고 Identity Providers를 추가한 뒤 호스팅 UI 를 통해서 로그인/가입까지 완료했다.
- 다음 글에서는 OAuth 2.0 기본 Flow를 따라서 Cognito 사용자 풀과 호스팅 UI를 연동하여 Authorization Code를 발급받고
- 이를 기반으로 엔드포인트에 접근하여 Token발급, UserInfo 조회하는 기능을 살펴본다.
<참고>
- https://aws.amazon.com/ko/cognito/details/
- https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/what-is-amazon-cognito.html