오늘은 AWS의 Cognito를 사용하는 방법에 대해서 알아보고,
추후 안드로이드 앱에서 적용할 수 있도록 설정해 보도록 하겠습니다.
먼저 Cognito에 대해서 간단히 알아보고 설정화면을 보도록 하겠습니다.
1. AWS Cognito
회원가입과 로그인 기능등의 유저인증기능을 서버에서 구현하는 것은 상당한 노력과 시간이 필요합니다.
그것을 AWS의 API를 이용해서 구현하여 보안문제에 들어가는 것을 시간과 인건비를 AWS의 요금과 바꾸는 서비스가 Cognito입니다.
큰 기업에서는 서버팀이더라도, 보안팀을 따로 두고 관리하는데요.
이 서비스를 이용하면, 꼭 이메일가입뿐만이 아니라, FaceBook등의 SNS서비스를 통한 가입도 구현이 가능해 집니다.
사실 Gmail서비스를 가지고 있는 Google의 Firebase에도 이와유사한 기능이 있는데 구현이 매우 편했던 것으로 기억합니다.
AWS의 Cognito도 비슷하지만, 구현은 Firebase의 그것만큼은 편하지는 않았던 것 같구요.
대신 AWS가 제공하는 다양한 서비스들과 통합하여 사용할 수 있는 장점이 크므로, Cognito를 사용하게 되는 것 같습니다.
2. Cognito를 이해하기 위해 필요한 개념들
2-1. User Pool과 Identity Pool
Amazon Cognito에 들어가면 아래와 같이 크게 두가지를 Manage하는 화면이 나오는데요.
Cognito를 사용하기 위해서는 User Pools와 Identity Pools에 대해서 알아두어야 하는데요.
특히, UserPool을 중심으로 이해해 주시면 될 것 같습니다.
개인적으로는 Identity Pool의 경우는 그렇게 많이 사용하지는 않을 것 같네요.
구분 | 내용 |
User Pool | 유저 Directory를 가지고 있는 서비스입니다. 쉽게 말해서 유저명(이메일, 전화번호 또는 별도유저명)과 Password등이 들어있는 Database를 가지고 있는 것 인데요. 로그인을 통해 인증된 유저에게 ID 토큰을 발행해주거나, 회원가입을 할 수 있도록 해 줍니다. Gmail이나 Facebook같은 SNS서비스에 로그인해서 유저인증을 하는 것도 가능합니다. 로그인이나 인증과 관련된 정보는 이곳에 저장해놓고, 그렇지 않은 정보들은 데이터베이스에 저장해 놓는 것이 좋습니다. |
Identity Pool | 인증된 유저들에게 어떠한 과업들 혹은 AWS 서비스들(예: S3등)에 접근할 수 있도록, Credential을 제공해 줍니다. 이러한 Credential을 기초로 S3나 Lambda등의 AWS서비스에 직접 액세스하는 것이 가능해집니다. |
2-2. Authentication과 Authorization
이해하기 쉽게 예를 들어서 둘을 비교해 보겠습니다.
게시판에서 이 사람이 누구인지 Guest인지, A유저인지 구분하는 것이 Authentication이구요.
인증된 A유저이므로 글을 쓸수 있고, Guest는 글을 못 쓰는 등의 권한에 있어서 차이가 발생하는데요.
이렇게 어떤 과업에 대해서 권한이 있는가가 Authorization이라고 합니다.
예를 들어서, Authentication을 통해서 유저인지 그리고 ID는 무엇인지를 확인해 주구요.
이 유저가 AWS의 S3등에 접근할 수 있는지는 Authorization을 통해서 정한다는 것 입니다.
만약, S3에 접근할 수 없는 낮은 레벨의 유저라면, 해당 리소스에는 접근할 수 없겠지요.
2-3. ID Token과 Access Token 그리고 RefreshToken
User Pools에서 인증된 사용자를 위해서 Congito가 발행하는 토크들에는 3가지 Token이 있습니다.
이해하기 쉽게 실제 예를 생각해 보겠습니다.
인증된 유저에게만 S3서비스에 접근해서 저장된 이미지들을 볼 수 있는 서비스가 있다고 가정해보겠습니다.
최초에 유저가 로그인을 하면, 첫번째 토큰인 ID Token을 받게 됩니다.
클라이언트는 매번 Congito에게 유저가 맞는지 물어보지 않고,
이 토큰을 가지고 서비스들에 접근하게 되는데요.
S3에 Access할 수 있는지 확인하기 위해서, ID Token을 가지고 User Pools에 확인을 해서,
맞다면, Access Token을 받고 토큰이 유효한 시간동안은 그것을 가지고 S3에 접근해서 이용하게 됩니다.
Refresh Token은 Token을 갱신하는데 쓰이구요.
구분 | 내용 |
ID Token | User Pool에서 인증된 사용자에 대해서, 일정시간(디폴트는 1시간)동안 유효한 Identity Token이 JWT의 형태로 발행되게 됩니다. name등의 사용자 정보도 포함되어 있는 Token입니다. |
Acccess Token | 사용자의 정보가 포함된 것이 아니라, 특정한 과업에 Access할 수 있는가에 대한 정보를 가지고 있다. 역시 일정시간(디폴트는 1시간)이 지나면 만료됩니다. |
Refresh Token | 기존 토큰이 만료되었을 경우 갱신을 위해서 사용. 디폴트값은 1달로 설정되어 있구요. 1~3650일 사이로 설정이 가능합니다. Access Token을 갱신하기 위해서 사용합니다. 보안을 위해서 Refresh Token이 탈취되지 않도록 해야 합니다. |
3. 가격
User Pool을 생성하기 위해서 Cognito를 사용하게 될 경우,
과금은 MAU(Monthly Active User)를 기준으로 하게됩니다.
아무리 회원가입수가 많아도, Active하지 않은 유저에 대해서는 과금되지 않구요.
다만, SAML 2.0 기반 자격 증명 공급자를 통해연동되는 사용자의 경우는 조금 다른 요금체계를 가지고 있으니,
해당되는 경우는 공식사이트를 통해서 알아볼 필요가 있습니다.
3-1. FreeTier
무료로 제공해주는 양은 MAU기준 50,000명까지입니다.
게다가, Cognito는 1년동안만 FreeTier를 제공해주는 것이 아니라,
무기한으로 FreeTier가 제공되어집니다.
Active유저를 기준으로 50,000명이하라면, 과금에 대해 걱정할 필요가 없다는 것 이지요.
구분 | 과금기준 MAU |
User Pool 로그인 기준 | 50,000명 MAU |
SAML 2.0 기반 자격 증명 공급자를 통해 연동되는 사용자의 경우 |
50명 MAU |
3-2. FreeTier초과 과금
User Pool credentials 또는 social identity providers(SNS로그인) 를 통한 로그인의 경우
참고로 Advanced Security Features 를 사용하시게 된다면,
FreeTier도 적용이 되지 않고 비용은 아래와 같이 급격히 증가합니다
이제 요금에 대해서 정리해 보았으니,
50000MAU까지는 무기한 무료인 Cognito서비스를 이용하기 위해서,
AWS Console에서 User Pool을 생성해 보도록 하겠습니다.
4. AWS Console 에서 User Pool 생성하기
AWS콘솔에서 Cognito를 찾아서 들어가게 되면 아래와 같은 화면을 보게 되는데요.
먼저, 왼쪽의 User pools 관리(Manage User Pools)로 들어가 보겠습니다.
그럼 아래와 같이 user pool을 생성하라고 나오는데요.
Create a user pool 버튼을 클릭해 줍니다.
이제 User Pool을 설정하는 화면이 나오는데요.
하나씩 보도록 하겠습니다.
4-1. Name
제일 먼저 할 것은 역시 user pool의 이름을 만드는 것 입니다.
Step through settings를 선택해주어서, 단계별로 보도록 하겠습니다.
대부분 디폴트값에서 크게 변경하는 것은 없어서 편안하게 체크해 나가시면 됩니다.
4-2. Attributes
Attributes화면에서 설정할 수 있는 값은 아래 이미지와 같은데요.
특별히 수정할 것은 많지 않구요.
화면 하단에서 nickname attribute를 추가하는 정도가 필요해 보입니다.
email은 서비스에 따라 바꾸기도 어렵고, 서비스마다 다른 사용자명을 원하는 유저들을 충족시키기 어렵기 때문에, 개인적으로는 꼭 추가하는 부분입니다.
4-3. Policies
policies부분인데요.
비밀번호는 최대한 어렵게 하는 것이 좋을 것 같은데요.
다만, 아래와 같이, 대문자, 특수문자에 숫자까지 필요할 경우 스트레스를 받는 유저들도 있으니 감안을 해야할 것 같습니다.
4-3. MFA and verifications
다음은 MFA and verifications부분인데요.
이곳에서는 대부분의 기본설정을 그대로 이용하고 넘어가겠습니다.
다만, 아래 부분은 유저가 비밀번호를 잃어버렸을 경우 계정을 찾는 방법에 대한 것 인데요.
저는 Email로만 확인한다는 옵션설정으로 변경해 두었습니다.
디폴트값은 첫번째인데, 그대로 놔두어도 무방하기는 합니다.
4-4. Message and customizations
다음이 중요한 Message and customizations인데요.
다른 부분은 디폴트값을 사용하더라도, 아래의 인증부분은 신경쓰셔서 선택하면 좋은데요.
물론, 디폴트값도 충분한 것 같습니다.
Email message는 당연히 한글로 수정해주셔야 하구요.
아래쪽의 사용자 초청메세지(user invitation messages는 비밀번호 분실시 사용하는 것 입니다.
4-5. Tags, Devices
Tags는 넘어가도록 하겠습니다. 특별히 많은 서비스를 사용하고 계신게 아니라면 필요하지 않을 것 같습니다.
Devices들도 저희같은 개인 혹은 소규모 개발자들이 신경쓸 정도는 아니므로 디폴트값으로 넘어가겠습니다.
4-6. App Clients
다음에 봐 두어야 할 것이, App clients인데요.
Cognito의 UserPools를 이용할 수 있는 앱을 설정해 주는 화면입니다.
아무것도 추가되어 있지 않으므로, Add an app client를 클릭해 줍니다.
이제 아래 이미지와 같은 화면이 나오는데요.
App client name에 App클라이언트의 이름을 추가해 줍니다.
관심있게 볼 것은 token의 유효기간입니다.
위에서 ID token, Access token 그리고 Refresh token에 대해서 정리해 보았는데요.
클라이언트 앱에서 발급된 토큰의 유효기간에 대한 설정값들이 나오는 것을 볼 수 있습니다.
ID token과 Access token은 유효기간이 1시간이구요.
갱신하는데 사용하는 Refresh token은 30일로 설정되어 있습니다.
디폴트값으로는 client secret을 생성하도록 되어있는데요.
테스트목적으로 사용할 때는 이것을 해제할수도 있겠지요.
하단의 Create App Client를 눌러줍니다. 이후 Next Step을 눌러 다음으로 넘어가주면 됩니다.
4-7. Triggers
인증의 단계별로 필요한 Lambda를 통해 필요한 이벤트가 트리거되도록 활용할 수 있습니다.
여기서는 그냥 Next Step을 눌러서 넘어가도록 하겠습니다.
4-8. Review
최종적으로 Review화면이 나오구요.
아래와 같이 나오게 되는데, 수정이 필요하신 부분이 있으면,
각 박스의 우측상단의 연필모양버튼을 눌러서 수정해주시면 됩니다.
다 확인하였다면, 하단의 Create Pool버튼을 눌러주면 됩니다.
생성이 완료되면 아래와 같이, User Pool ID가 나오는 것을 알 수 있습니다.
중요한 정보는 User Pool Id와 앱클라이언트의 ID및 Secret Key인데요.
Pool Id는 확인했으니, 좌측 네비게이션에서 앱 클라이언트를 눌러서,
클라이언트의 ID및 Secret Key를 확인해 줍니다.
이 값들을 앱클라이언트의 코드에서 가지고 있어야, Cognito의 UserPools에 접근할 수 있겠지요.
이말은 클라이언트에서 ID와 Secret Key가 공개되지 않도록 주의해야 한다는 말이 되겠습니다.
예를 들어, 앱의 디컴파일시 노출될 수 있다면, 발생할 수 있는 문제들도 생각해보아야 하겠지요.
이제 앱에서 구현을 하기위해 AWS콘솔에서 해야할 설정들은 모두 끝이 났습니다.
Android 앱에서 적용하는 일만 남았네요.
5. User확인하기
생성된 유저를 확인하거나, 유저를 추가할 때는 Users and groups에서 확인할 수 있습니다.
6. 정리
이제 앱에서 구현할 수 있도록 Cognito의 기본적인 설정은 되었습니다.
이것을 이용해서 Android 앱에서의 구현 방법은 다른 글에서 정리하도록 하겠습니다.
'Cloud Services > AWS, Mongo Atlas' 카테고리의 다른 글
MongoDB Atlas 무료 로 사용하기 (0) | 2022.02.06 |
---|---|
S3 서비스에 대한 정리 # S3 버킷 AWS (0) | 2021.04.10 |
RDS Replica의 부하를 분산하는 방법 #Route53 #AWS (0) | 2020.05.12 |
RDS를 복제해 주는 Replication 설정하기 #Master #Slave #AWS (1) | 2020.05.09 |
EBS(Elastic Block Storage)에 대한 정리 #EC2 #AWS (0) | 2020.05.08 |
AWS와 Firebase 비용에 관한 생각 정리 (0) | 2020.05.07 |
사용자수에 따른 AWS 아키텍처 설계하기 (1) | 2020.05.06 |
ELB에 무료 SSL인증서 받아서 설정하기 #ACM #HTTPS #AWS (0) | 2020.05.02 |
Route53을 이용해 도메인과 ELB 를연결하는 방법 #AWS (0) | 2020.05.01 |
RDS 백업과 복원하기 #AWS (0) | 2020.04.28 |
댓글