본문 바로가기

웹 운영/AWS

[CDA] 섹션 27 - 유저가 누군지 알아보는 Cognito

728x90

<402,403 - 개요 및 사용자 풀>

 

 

> User 에게 Identitiy (자격 증명) 를 부여, 웹 앱과 상호작용할 수 있도록 함

> AWS 계정 외부에서 접근 (일반 유저) 하기 때문에 우리가 모르는 사람들임. 

> 두가지 기능으로 정리된다

 

> User Pool

>> 사용자들에 대한 로그인 Sign In 기능을 제공

>> API Gateway / ALB 와의 Integration 이 매우 유용

 

> Cognito Identity Pool (Federated Identity)

>> 외부 유저들에게 AWS 리소스에 직접 접근할 수 있도록 일시적인 AWS Credential 을 제공하는 것

 

> Cognito 는 IAM 과는 다르게 외부의 유저들을 인지하기 위한 것으로, Keyword 로는 "수많은 유저", "모바일 유저", "SAML 인증" 등등이 있다

 

 

<User Pool (CUP)>

 

> 웹 앱 사용자들에 대한 서버리스 DB 를 만드는 방법, CUP 는 JWT 를 활용한다

> 제공하는 기능 :: 로그인 / 패스워드 초기화 / email & phone Verification / MFA / 연합 인증 (Federated Identity) : Facebook, Google, SAML 등의 로그인

>> 보안 기능: 유저의 credential 이 유출되었을 경우 이름 감지해서. 웹을 스캔해서 유출된 정보 확인 및 사용자 차단 기능, 사용자에게 알림

 

 

Cognito 의 기본적인 개요 모습

 

 

> CUP 는 유저에 대한 DB 를 가지고 있고, Client 들이 로그인에 성공할 때마다 JWT 를 반환한다

> 제 3자 Identity Provider (IdP라고 한다) 들과 Federation 이 가능, 소셜 로그인!

 

 

<CUP 과 AWS 의 통합>

 

 

Cognito 는 Gateway / ALB 와의 상호작용이 우수하다

 

 

> API Gateway / ALB 와 상호작용을 자주 함

> Gateway

>> Client 가 CUP 와 직접 인증을 주고 받고, Web Token을 사용하여 API Gateway 로 이동.

>> Gateway 는 직접 토큰을 Cognito 를 통해서 확인한다

> ALB

>> Listener & Rule 을 연동하여 CUP 과 통신을 할 수 있도록 설정 (인증에 대한 요청, JWT 반환/확인에 대한 요청)

>> 인증이 되거나 확인이 된다면 그제서야 TG 으로 이동시키는 로직으로 동작

 

 

----------------------------------------

 

 

<404 - 사용자 풀 실습>

 

 

> 생성시 User Pool 할건지 Federation 할 건지 선택 가능

> 로그인 옵션 설정 가능 (username, email, phone), PW 요구사항 설정 가능, MFA 요구할건지 설정 가능, 계정 복구 설정 가능

> 또한 설정할 DB Column 들 설정 가능 (required attribute / custom attribute - 생일, 가족, 성별 등등의 개인정보) 

 

> 이메일을 보내야되는 상황일 시, SES/SNS 이용 or 그대로 Cognito 이용 선택 가능 (Cognito 가 무료가 매일 주어지기 때문에, 개발시에는 이게 나음)

> Hosted UI 사용할지 설정 가능 (Cognito 가 제공하는 것) > 존재한다는 것을 시험에서 물어볼 수도!, 사용하려면 URL 도 기입

 

> 초기 앱 클라이언트

>> Public Client : Public 앱에다가 Cognito 를 사용하는 경우?

>> Confidental Client : Client Secret 을 설정해야 하는 경우(?), Cognito API 가 Client 측이 아닌 관리 서버 측에서 요청되는 경우.

>> Other : 기타의 Case

 

 

AWS Cognito 에서 제공해주는 Hosted UI 화면. 원하는 대로 customize 도 가능하다 (사진 설정 등)

 

 

> Hosted UI 보기를 하면 로그인 / (설정한대로) 회원가입까지 할 수 있다 (이 때 설정한 요구사항들도 적용된다) 

>> 이 때, 이메일 인증까지 설정할 수 있다

 

> 인증/로그인을 완료하면 내가 설정한 Hosted UI Callback URL 로 이동한다 (내가 원하는 곳으로 이동시킬 수 있음, 가령, 내 website home)

 

> 예시로 회원가입을 해보면, Cognito User Pool 에 이동시 User name 에 추가되어 있고, email 주소 및 verified 여부까지 확인할 수 있음

>> Welcome Email 도 보낼 수도 있음 ㅋㅋㅋㅋ 

>> Federation with IdP 를 하면 원하는 서비스대로 OAuth 2.0 을 연동할 수 있다 (진짜 개편하다 ㅅㅂㅋㅋㅋㅋㅋㅋ)

>> 참고로 각 서비스와는 직접 연계하여 Client ID, Client Secret 등을 가져와야 함 ㅇㅇ

 

> Lambda Trigger 설정

>> 사용자 풀 내에서 발생하는 일에 대해 반응할 수 있다 (람다 함수로 대응, 회원가입 시 관리자에게 이메일)

>> Trigger Type : 회원가입 / Authentication 진행 / CAPTCHA 같은 Custom Auth / Messaging 등

>>> 각 Trigger Type 이 정확히 어떤 CASE 를 말하는건지 한번 확인해보는 것도 좋을 듯! 뒤에 두개 잘 모르겠음 ㅠ

>> 각 Trgger 마다 정확한 세부 Trigger 도 설정 가능 (ex: Pre, Post SignUp, Migrate user trigger 등)

>> 마지막으로 Lambda Function 을 선택해주면 된다!

 

 

----------------------------------------

 

 

<405 - 사용자 풀 기타 (실습 이론 복습)>

 

 

CUP 의 Lambda Trigger

 

 

> CUP 는 위와 같은 형태의 Lambda Trigger 를 수행할 수 있음, 안나온건 위에 설명 참조

> Auth Event

>> 1. 로그인 요청을 승인 / 거절 (커스터밍) 가능

>> 2. Event 를 발생시켜 로깅을 주기 위해 Post 

>> 3. 토큰관리 

> Sign Up

>> 2. 웰컴 메세지 가능

> Message > 사용자에게 보내는 메세지를 Customize 가능

> Token Creation > Token 에 정보 추가 및 제어

 

 

<Hosted Auth UI>

 

> 회원 / 인증과 관련된 UI 를 개발할 필요 없이 Cognito 가 제공해주는 것을 사용할 수 있다

> SNS 로그인 / OIDC / SAML 따위와도 아주 아주 쉽게 연동 가능

> 로고, 더 깊이는 CSS 등을 커스터마이제이션 가능

 

> Custom Domain 에 이 Hosted UI 를 쓰고 싶을 수도 있음

>> 어떤 지역에서 하든지 상관 없이, HTTPS 통신을 해야 하고, 이를 위한 인증서는 "ACM" 이란 곳에 있어야 하고, 리전은 반드시 "us-east-1" 이여야 한다

>> Congito Pool 이 eu-west-1 에 있다고 해도, us-east-1 에 Certi 를 둬야 한다

>> 콘솔에서 [App Integration] 섹션에서 정의할 수 있음

 

 

<Adaptive Authentication>

 

 

Attacker 의 공격을 감지

 

 

> 사용자가 정상적으로 로그인 하되, 조정 인증을 사용하면 수상한 로그인이 있을 경우, 로그인 차단 or MFA 를 요구할 수 있다

> 각 로그인 시도는 Cognito 로 부터 검사되는데, 이 때 risk-score(L,M,H) 가 체점된다. 악의적 공격자의 요청일 가능성에 대해 체점

> risk 가 감지되면 시도하는 유저는 MFA 따위의 추가 검증을 수행해야 할 수 있다

>> 가령, 평소 로그인 하던 지역 이외의 곳에서 로그인을 시도 (의심스러우므로, 너라는걸 검증해야 함, 다소 naive 한듯?) 

> risk factor 요인으로는 - device, location, IP Address 정도가 있다

> 이 모든 것들은 당연히 CW Log 에 기록 된다 (로그인 시도, risk score, failed MFA 등)

 

 

<JWT Token 활용, Decoding>

 

 

CUP 에서 반환하는 JWT Token 의 Payload 부분 예시

 

 

> Header, Payload, Signature 로 구성, Base64 Encode 된 상태로 돌아다니고, 이는 네트워크 상에서 쉽게 오고갈 수 있는 형태이기 때문

> Decode 하면 내부 내용이 쭉 나옴. Payload 가 말그대로 주요 Data 가 있는 곳

 

> 하지만 우선 JWT 토큰을 수신하면 Signature 를 Verify 해야 Payload 의 정보를 믿을 수 있다

> 서명은 맨 밑에 있고, 알고리즘이 있다. 알고리즘으로 서명이 올바르면 Payload 정보는 믿어도 됨. 이렇게 하는 것

> 서명이 확인되면 Payload 를 사용할 수 있는데, 여기에는 주된 User Information 이 있다

>> ex: sub UUID (User ID in CUP), email, given_name, phone 등등

>> 참고로 이 sub UUID 를 사용하면 어떤 User 정보든지 recover(?) 할 수 있다고 함 (아마 Cognito 내부 DB 에서 가져오라고 추가적인 요청을 할 수 있다! 이거 아닐까 싶음)

>> 바로 위에 한말 맞음. 저기 있는 정보 혹은 그 외의 정보를 더 look up 필요하면 CUP DB 에서 sub UUID 를 통해 조회할 수 있다 (API 사용할 수 있을 듯)

 

 

----------------------------------------

 

 

<406 - ALB 와의 사용자 인증>

 

 

> ALB 로 Cognito 와 연동에 대해서 좀 더 자세히

> Authenticate User 에 대한 책임을 ALB 에게 부여할 수 있음 (앱은 신경 안써도 됨, 비즈니스 로직에 집중)  - 진짜 좋은 듯 ㅋㅋ

> HTTPS Listener 를 사용해야 함 (authenticate-oidc & cognito rule 을 적용하기 위해서)

>> 로드밸런서 구성시 Listener (포트에 점유하면서 리슨 하는 곳) 를 Https Protocol 로 443 Port 에 점유시킬 수 있음

 

> ALB 도 다음과 같이 인증

>> IdP 이용 : OpenID Connect (OIDC) 를 준수하는 자격 증명 공급자

>> CUP 이용 

>>> Social IdPs ex: AWS, FB, Google  

>>> 혹은 SAML, LDAP, MS AD 와 호환되는 기업 자격 증명이 있는 경우 

 

> Unauthenticated Request 에 대해서는 3가지 >> (default) 인증 요청을 함 / deny / allow (ex: login page 같은 경우는 인증이 불필요 하기 때문에 허용한다) 

 

 

ALB + Cognito 의 개요

 

 

> 유저들이 GET 요청을 할 경우, ALB 는 이 HTTPS 요청에 대해 Cognito 에게 인증을 요청한다

> 인증이 완료될시 JWT Token 반환하고, 이 유저가 누구인지에 대한 정보를 다시 담아서 Original 요청과 함께 후속 백엔드에 전달한다

>> 인 앱에서 사용자 정보를 바탕으로 비즈니스 로직을 제어할 수 있다

 

 

< CUP 사용하는 경우>

 

> ALB 로 가서 CUP 와 Client / domain 을 연동한다 (미리 생성해둘 필요)

> JWT Token 반환이 되는 것을 확인하고, 원한다면 IdP 와 Federation 진행

> 필요한 URL Redirection / Callback 등을 지정

> CUP 할 때랑 그냥 거의 똑같이 하면 되어서, 크게 어려움은 없는 과정!

 

 

<OIDC Auth 를 사용하는 경우 - 이거 SSO 인듯 ㅋㅋㅋㅋ>

 

 

OIDC 인증을 사용하고 있다면 Cognito 연계를 사용하지 않는다

 

 

> HTTP 요청 발생시 , ALB 가 User 를 IdP 의 Auth End Point 로 Redirection 을 하게 된다

> 이 때 이 인증 하는 곳에서 Auth. Grant Code 를 전달하고, 그게 다시 ALB 로 전달됨

> ALB 는 이를 다시 Token End Point 로 전달해, 적절한 Access Token 으로 교환해서 가져옴 (여기까지 내가 아는 과정인듯, SSO 에선 두 EndPoint 를 합친 듯?) 

> 그럼 이를 User Info EndPoint 에 Access Token 을 꽂아 넣고, 그러면 User Info Endpoint 에서 User Claims 정보를 전달해주게 됨

> 그제서야 ALB 는 User Claim 정보를 원래 요청과 함께 Payload 에 넣고 후속 백엔드로 전달

 

> 설정할 때 그래서 구성할게 좀 많음. Authorization EndPoint, Token End Point, User Info EndPoint, 연계한 곳과의 Client Id, Secret 모두 다 넣어야 함

>> 일반적으로 연동하는 IdP 쪽에서 Guide 가 있으니, 그걸 참고해서 설정에 기입하면 되긴 함

 

 

----------------------------------------

 

 

<407 - Cognito Identity Pool (Federated Identities) : IdpP 와 연계하는 것.. 근데 지금까지 한거랑 뭐 크게 다른가..? ㅇㅇ 다르네>

 

 

> 좀 어려운 부분!! 잘 이해해보자!

> CUP 랑 하는 기능이 많이 다른데 Cognito 하위 기능으로 분류된게 잘 이해 안된다고 함

> CUP 때랑 똑같이 외부 유저들이 있는거고, AWS 환경 내 리소스들에게 접근하고 싶은 것

>> DD, S3 등에 외부 유저들이 접근하려고 하는건데, 이럴 경우에는 일시적인 "AWS Credentials" 가 필요

> IAM 유저를 발급하기에는 너무 많고 안전하지도 않으므로, Cognito Identity Pool 을 이용해 AWS로의 액세스 제공

 

> Identity Pool 은 다음과 같은 Identity Source 를 활용할 수 있다

>> Amazon, Facebook, Google, Apple 등 제 3자 Public Providers 의 로그인

>> CUP 를 통해 로그인한 유저들

>> OIDC Providers & SAML Providers

>> 개발자들이 직접 제공 가능 - custom login server (Developer Authenticated Identities)

>> 로그인된 사용자 외에 AWS Credentials 을 발급받기 전에 사용(?) 하기 위한 Unauthenticated(guest) access 를 설정할 수 있다 (Guest Policy 설정 가능 - 그리고 guest users 에게 AWS 자격 증명 부여)

 

> Users 들이 위처럼 AWS Credential 를 얻었다면, AWS 서비스들을 SDK를 이용한 API 호출 혹은 API Gateway 로 접근 가능하다

> 사용들이 제공받는 Credentials 들은 Cognito 에 Define 되어 있는 IAM Policies 들을 가지고 있다

> 이후 또 나오지만, user_id 를 통해 customizing(?) 이 가능하다 (for fine-grained control) 

 

 

CIP 는 외부 유저에게 AWS Credentials 을 발급하여 접근 제어를 지원해준다

 

 

> 웹 & 모바일 클라들에게 S3/DD 직접 접근을 주고 싶은데, 이 앱을 위한 IAM User 를 만들고 싶지 않으면, CIP 를 사용한다

> 위에서 말했듯이 어떤 방식을 사용해서 Token 을 GET 하고, 이 Token 을 사용해 CIP 로부터 AWS Credential 을 발급받는다

>> CP 는 임시 자격 증명을 받기 위해 STS 서비스와 통신한다

> CUP 와는 다른 측면이 많지만, 신분 제공 맥락에서는 비슷함

 

 

<CUP 와 CIP 를 같이 사용하면 어떤 그림?>

 

 

CUP 를 사용하면 위와 같은 그림이다. 그냥 똑같은데 CUP 쓰는건데, 이 때 CUP 만 따로 Social 로그인 연동할 수도 있다

 

 

> 다 똑같은데,로그인 방식을 CUP 사용 하고, CUP 의 Internal DB 를 사용할 뿐

> 이 때 CUP 는 독립적으로 Federated IdP Providers 들과 연계할 수도 있다 (소셜 로그인 UI 제공 가능?)

>> 근데 이럴 바엔 그냥 CIP 랑 Federation 하는게 낫지 않낭? ㅋ

 

 

<CIP 가 어떻게 어떤 Role 을 유저에게 줄지 알 수 있을까?>

 

> 이 부분 살짝 뭔소린지 모르겠음. 그냥 일단 Policy 랑 Role 을 잘 모르겠음 (꽤나 심화 내용이라고 한다)

> authenticated & guest user 에게 기본 IAM Role 을 정의할 수 있다 

> user ID 를 기반으로 어떤 유저에게 어떤 Role 을 줄지 Rule 을 정의할 수 있다

> IAM Policy 를 Customize 한다 - Policy Variable 사용

>> 사용자들이 그들이 원하는 리소스에만 접근할 수 있도록 setting 가능 (일부 DD, 특정 S3 등)

 

> IAM Credential 에 IAM Policy 가 있는 것이고, 이 IAM Credential 들은 CIP 가 STS 란 것과 상호작용해서 가져온다

> Role 은 CIP 에 대한 "Trust Policy" 를 가지고 있어야 동작한다고 함. 아래 예시를 보자

 

 

인증되지 않은 유저 (Guest) 에게 아주 제한된 접근을 허용한다

 

 

> Guest User 에게 AWS 리소스에 대한 액세스를 허용하려 함

>> 그래서 any guest user 가 S3 Bucket 내 my_picture.jpg 파일에 대해 Get Object 를 할 IAM Policy 를 만든다

>> unauthenticated user 에게 아주 제한된 접근을 제공해주는 것

 

 

Policy Variable 을 사용해 인증 User 에게는 동적으로 IAM Policy 를 제공한다

 

 

> user identity 를 명시한 PREFIX 에 대한 폴더에만 접근이 가능하도록 한다 (애초에 S3를 그렇게 설계해야  하는 듯)

> 위 그림은 해당 사용자 ID를 Prefix 로 사용하는 객체들에만 접근할 수 있다 (가령, 유저별 앨범 이런거?) 

>> user_id 를 통해 사용자들이 허용된 부분에만 액세스할 수 있도록 한다 (Fine-grained control)

 

 

DD 에서도 비슷하게 적용할 수 있음

 

 

> DD 에서도 비슷하게 사용할 수 있다

>> DD 의 Leading Key 가 사용자의 user_id 랑 corresponding 할 때, DD에서 Policy 에 명시된 Table 에 ~~ Action 을 수행할 수 있다 이런식으로 권한을 준다. (Leading Key 가 뭐야 씨부레 ㅋㅋㅋㅋㅋ ㅠㅠ)

>> row-based security 를 쉽게 적용할 수 있었다!!

 

 

----------------------------------------

 

 

<408 CIP 실습>

 

 

> Cognito 에서 CUP 가 아닌 자격 증명 풀 생성으로 (CIP) 이동

> Authenticated & Guest Access 중 어떤 것을 사용할 것인지 선택 (둘다도 가능)

> Authenticated 일시 위에서 배운 것처럼 Authentication 을 받아오는 Source 가 어딘지 선택 : Facebook, Google, CUP, Apple 등

>> 누구나 우리 풀에 접근해서 (로그인 없이) 임시 허용 Credential 을 받을 수 있게 하려면 Guest Access 도 선택! 

 

> Authenticated Role 을 지정해야 하는데, Credential 인증 사용자가 Assume 하게 될 Role 이다

>> 나중에 더 자세히 나옴

> Guest Role 도 지정해야 한다. 이것 역시 동일함 (Guest 가 갖게 될 권한 지정)

 

> IdP 를 연결하는 부분 (여러가지 연동할 것 기입하거나, CUP 였으면 CUP 지정) 

> 어떤 유저가 어떤 role 을 가지게 되는지에 대한 Rule 을 지정할 수 있는데, 이건 잘 이해가 안됨

> 어쨌든 사용하는 곳에서 (Client 가 어쨌든 너의 AWS 리소스에 접근해야 한다 아님?) AWS SDK 를 import 해서 사용하면 된다

 

> IAM 으로 이동해서 Role 로 가보면, 아까 만들었던 Guest / Authenticate Role 이 두개 있다.

> 여기서 이 Role 을 직접 수정해서 사용자들이 어떤 IAM Role 을 가지고 우리 AWS 에 접근하게 되는건지 명시를 할 수 있다

> Policy 를 추가하면서 Role 을 수정할 수 있다 (Role 이란 특정 시간동안 부여되는 것, Policy 는 정책을 가지고 있으면 계속 가지고 있다는 의미)

(https://going-to-end.tistory.com/entry/AWS-IAM-%EC%A0%95%EC%B1%85policy-%EC%99%80-%EC%97%AD%ED%95%A0role-%EC%9D%98-%EC%B0%A8%EC%9D%B4)

 

 

----------------------------------------

 

 

<409 CUP vs CIP>

 

 

> CUP 는 일단 인증을 위한 거임 (Identity Verification) = Authentication

>> "로그인" (인증) 만을 위한 Federation 이 가능한 것

>> 너의 서비스를 위한 Member DB 를 구축해주는 것

>> 로그인/회원가입에 대한 UI 제공 가능

>> Pre/Post 등 Auth 과정 중 특정 Trigger 에 대한 람다 함수 호출 연동이 가능하다

>> 로그인에 대한 검사를 진행, risk-level 을 측정하여 로그인에 대한 부가 제어도 가능 (MFA 등)

 

> CIP 는 인가를 위한 거임 (Access Control) = AWS 내 리소스에 대한 액세스 관리

>> 사실 잘 모르겠음. 서비스가 직접 SQS 나 S3 에 뭐시기를 하려면 AWS 액세스 권한이 필요한걸까? 지금까지 했던건 All Open 했기 때문인걸까? 그래서 사실 SDK 를 쓸 때 권한 같은거 써야 하긴 하는거려나. 그래서 그걸 CIP 로 쓸 수 있다 이런건가? 좀 헷갈림 ㅠ

>> 로그인 / 회원가입 제어만 하고 싶고 Member DB 만 있으면 된다 하면 CUP 로 충분하다

>> 하지만, 이 유저들이 AWS 환경에 (DD, S3 버킷) 접근하려 한다면, 이 작업은 CIP 로 이루어진다

>>> 사실 이게 이해가 안되는거긴 함. 서버 앱에서 접근하잖아. 유저가 직접 접근한다? 이게 무슨 경우인건지 잘 모르겠음 (지피티한테 물어보자)

>> CIP 를 써도 어쨌든 유저 로그인이 필요함 (Guest 가 아니라면) 

>> 사용자가 어디에서 로그인 인증을 받던, 가져온 token 으로 "권한"을, AWS Credential 을 부여받을 수 있다는 것

>> 인증 없이 Guest 권한도 줄 수 있는데, 이 때 Policy Varaiable 을 사용해 선택적으로 권한을 mapping 해줄 수 있다 (이것도 완벽하게 이해가진 않았음 ㅋㅋ)

 

> CUP 와 CIP 를 같이 사용하면 Authentication & Authorization 을 한번에 사용하게 되는 것

> 위에 CUP + CIP 그림을 다시 보라

> CUP 를 통해 로그인 함 (자체 DB or Federation)

> 그러면 유저는 Token 을 받게 된다고 했음. 이 Token 을 CIP 에게 제공해서 Temporary AWS Credential 을 받는 것임

 

> 좀 어렵긴 했음..... 완벽한 이해보단 그냥 전체적인 개요와 외울것들만 챙기면 될듯! (GPT 랑 좀 면담하면서 이해해보는 시간이 필요하긴 할듯)

 


----------------------------------------

 

 

<퀴즈>

 

 

 

 

 

====================================================================================

 

 

교육 출처

 

- AWS Certified Developer Associate 시험 대비 강의 - Udemy

 

https://www.udemy.com/share/105Hxw3@z0Wqme5D9voly52i8MuQYl_c8462GP25Oul4H38G3nVfgD4fMrYPJE5LOB88iDuZ/

728x90