Cognito 보안이 적용된 서버리스 3 Tier 아키텍처 개발 방법

5분 분량
콘텐츠 수준: 고급
1

게시판의 글을 쓰거나 또는 인가된 사용자만이 볼수있도록 하기 위해 API를 호출할때 사용자 인증을 진행해야 합니다. 여기에서는 Cognito를 이용해서 사용자풀에 있는 사용자를 인증하고 인증된 사용자만이 글을 쓸수있도록 하는 API 솔루션을 설명 해드리려고 합니다.

현재 문서에서 사용하는 서비스들의 간략한 설명

Amazon Cognito는 웹 및 모바일 앱을 위한 자격 증명 플랫폼입니다. Amazon Cognito는 OAuth 2.0 액세스 토큰 및 AWS 보안 인증을 위한 사용자 디렉터리, 인증 서버, 인증 서비스입니다. Amazon Cognito를 사용하면 기본 제공 사용자 디렉터리, 엔터프라이즈 디렉터리, Google 및 Facebook 같은 소비자 ID 제공업체의 사용자를 인증하고 권한을 부여할 수 있습니다.

Amazon API Gateway는 규모와 관계없이 REST 및 WebSocket API를 생성, 게시, 유지, 모니터링 및 보호하기 위한 AWS 서비스입니다. API 개발자는 AWS 또는 다른 웹 서비스를 비롯해 AWS 클라우드에 저장된 데이터에 액세스하는 API를 생성할 수 있습니다. API Gateway API 개발자는 자체 클라이언트 애플리케이션에서 사용할 API를 생성할 수 있습니다.

AWS Lambda은 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다.

Amazon DynamoDB는 모든 규모에서 고성능 애플리케이션을 실행하도록 설계된 완전관리형의 서버리스 키-값 NoSQL 데이터베이스입니다. DynamoDB는 기본 제공 보안, 지속적인 백업, 자동화된 다중 리전 복제, 인 메모리 캐시 및 데이터 가져오기/내보내기 도구를 제공합니다.

솔루션 개요

아래 그림은 이번 가이드에서 제공하는 솔루션에 대한 전체 아키텍처를 나타냅니다. 해당 솔루션에서는 Amazon Cognito로 인증한뒤 토큰을 받아서 Post API 호출을 할때 인증을 수행합니다. 인증을 수행함으로서 인가된 사용자만 글을 쓸수있도록 할수있습니다. 토큰을 이용하여 API Gateway 에서는 연결된 AWS Lambda함수를 실행시켜 Client에서 받은 데이터를 DynamoDB에 저장합니다.

여기에 이미지 설명 입력

1단계: Cognito 사용자 풀 생성하기

  1. Amazon Cognito, [사용자 풀], [사용자 풀 생성]을 클릭합니다.
  2. 로그인 환경 구성 : Cognito 사용자 풀 로그인 옵션에서 [이메일]을 클릭후 다음단계로 넘어갑니다.
  3. 보안 요구 사항 구성: 멀티 팩터인증, [MFA 없음]을 클릭한뒤 기본설정을 유지한채 다음단계로 넘어갑니다.
  4. 가입 환경 구성 : 기본설정을 유지한채 다음 단계로 넘어갑니다.
  5. 메시지 전송 구성 : Cognito를 사용하여 이메일 전송으로 설정한뒤 다음 단계로 넘어갑니다.
  6. 앱 통합 설정: 아래와 같이 설정을 진행합니다.
  • 사용자 풀 이름을 지정해줍니다.(예시. Demo-Cognito-Userpool)
  • Cognito 호스팅 UI 사용을 선택합니다.
  • 도메인에서 [Cognito 도메인 사용] 을 클릭한뒤 도메인명을 입력합니다.(예시.<이름>-demo-domain)
  • 앱 클라이언트의 이름을 지정해줍니다.(예시.DemoAppClient)
  • 허용된 콜백 URL을 지정해줍니다. https://example.com
  1. 검토 및 생성 : 생성한 내용을 다시 한번 확인후에 생성합니다.

여기에 이미지 설명 입력

2단계: Cognito 사용자 생성하기

  1. 이전 단계에서 생성한 사용자 풀을 클릭한뒤 [앱 통합] 페이지에서 맨아래에 있는 앱 클라이언트를 클릭합니다.
  2. 호스팅 UI 섹션에서 [편집]을 클릭한후 OAuth 2.0 권한 부여 유형에서 [암시적 권한 부여]로 설정한뒤 저장합니다.
  3. 호스팅 UI 섹션에서 [호스팅 UI 보기]를 클릭하여 Sign up을 클릭한뒤 회원가입을 진행합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

  1. 이메일로 받은 인증 코드를 입력하여 인증을 완료합니다.

여기에 이미지 설명 입력

  1. Callback Page 가 뜬다면 정상적으로 등록된것입니다.

3단계: DynamoDB 생성하기

  1. DynamoDB 페이지에서 [테이블 생성]을 클릭합니다.
  2. 테이블 이름을 Demo-DyanmoDB 지정해줍니다.
  3. 파티션 키는 문자열을 클릭하여 숫자로 변경한뒤 id라고 입력합니다.

여기에 이미지 설명 입력

4단계: Lambda 함수에 사용할 IAM 권한 생성

  • IAM 페이지에서 [역할 생성]을 클릭합니다.
  • 사용사례는 Lambda를 선택한뒤 다음을 클릭합니다.
  • 권한 추가에서 AmazonDynamoDBFullAccess,CloudWatchFullAccess 권한을 추가합니다.
  • 역할이름을 입력하여 IAM 역할을 Demo-IAM-Lambda로 생성합니다.

여기에 이미지 설명 입력

5단계: Lambda 함수 생성

  1. Lambda 페이지에서 [함수 생성]을 클릭합니다.
  2. 함수 이름(Demo-Post-Lambda) 및 런타임의 경우 Python 3.11버전으로 설정합니다.
  3. [기본 실행 역할 변경]을 클릭하여 [기존 역할 사용], 이전단계에서 만든 IAM 역할을 연결합니다.
  4. 모든 설정이 완료되었다면 함수 생성을 클릭합니다.

여기에 이미지 설명 입력

6단계: Lambda 함수의 소스 코드 변경

  1. 이전 단계에서 생성한 Lambda 함수를 클릭한뒤 [코드] 를 클릭후 lambda_function.py를 아래와 같이 수정합니다.
  2. Ctrl +S 를 눌러서 저장한뒤 Deploy를 클릭하여 배포합니다
import boto3

def lambda_handler(event, context):
    client = boto3.resource('dynamodb')    
    
    table_name="Demo-DynamoDB"
    table=client.Table(table_name)
    
    response=table.scan(Select='COUNT')
    item_count=response['Count']
    
    data=json.loads(event['body'])
    title=data['title']
    contents=data['contents']

    if item_count==0:
        data={"id":1,"title":title,"contents":contents}
        table.put_item(Item=data)
    else:
        data={"id":item_count+1,"title":title,"contents":contents}
        table.put_item(Item=data)

7단계 : API Gateway 생성

  1. API Gateway 페이지를 열어 [API 생성] 을클릭합니다.
  2. HTTP API 를 선택한뒤 [구축]을 클릭합니다.
  3. API 이름을 Demo-APIGateway로 기입합니다.
  4. 기본적인 설정을 유지한채 API Gateway를 생성합니다.
  5. 생성한뒤에는 [Routes]를 클릭하고 [Create]를 눌러 경로를 아래와 같이 생성합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

  1. [통합 연결], [생성 및 연결], 통합생성에서 통합유형을 Lambda로 클릭한뒤에 이전에 만든 Lambda로 연결합니다.

여기에 이미지 설명 입력

8단계: API Gateway에 권한 부여하기

  1. 이전에 생성한 API Gateway를 클릭하여 [Autorization]을 클릭합니다.
  2. /post 경롤르 선택하고 [권한 부여자 생성 및 연결] 을 클릭합니다.
  3. 권한 부여자 이름에는 DemoCognito-Grant로 입력합니다.
  4. 발급자 URL은 이전 Cognito에서 만들어둔 사용자 풀 ID를 추가적으로 기입해야합니다.
  5. [대상 추가]를 클릭한뒤 대상을 추가합니다.,
    • Cognito에 앱클라이언트의 ID를 입력합니다.

여기에 이미지 설명 입력

9단계: 테스트 진행

  1. Cognito 페이지를 접속합니다.
  2. Amazon Cognito > 사용자 풀 > Demo-Cognito-Userpool >앱 클라이언트: DemoAppClient를 클릭합니다.
  3. [호스팅 UI] 보기를 클릭하여 로그인을 합니다.
  4. 로그인한 페이지의 URL 입력창에 id_token을 확인할수있습니다.

여기에 이미지 설명 입력

  1. id_token,access_id 등으로 구성되어 있는것들중에서 id_token의 값만 클립보드에 저장해놓습니다.
  2. Postman을 실행한후에 헤더에 Autorization 에 id_token의 값을 넣습니다.
  3. body에서 title과 contents 키로하는 json 파일을 넣어주고 Send를 눌러 api 호출을 합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

  1. 만일 헤더의 Autorization에 Cognito pool의 사용자가 아닌경우에는 아래와 같이 인증에러가 발생합니다.

여기에 이미지 설명 입력

10단계 : DynamoDB 에서 확인

  1. DynamoDB 를 클릭한뒤 생성한 Demo-DynamoDB를 클릭합니다.
  2. [표 항목 탐색]을 클릭하여 [실행]을 클릭하여 테이블에 저장된 정보를 확인합니다

여기에 이미지 설명 입력

리소스 정리

Amazon DynamoDB

  • DynamoDB 테이블을 삭제합니다.

Amazon Lambda

  • 생성한 Lambda 함수를 삭제합니다.

Amazon API Gateway

  • 생성한 API Gateway 버킷을 삭제합니다.

Amazon Cognito

  • 생성한 Cognito풀을 삭제합니다.

참고 자료

자습서: API Gateway에서 Lambda 사용

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/services-apigateway-tutorial.html

Amazon Cognito 사용자 풀

https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/cognito-user-identity-pools.html

1 댓글

좋은 글 감사합니다. 참고 하도록 하겠습니다.

profile pictureAWS
지원 엔지니어
답글을 게시함 8달 전