서버리스 앱에 인증 기능 추가하기
서버리스 앱에 인증 기능 추가하기
이번 섹션에서는 AWS에서 서버리스 앱의 인증이 어떻게 작동하는지 살펴보겠습니다. 다음 몇 장에 걸쳐 다양한 인증 옵션을 알아볼 예정입니다.
먼저 배경부터 살펴보겠습니다. 회사에서 RFID 보안 배지를 발급받았다고 가정해 보겠습니다. 매일 아침 담장의 금속 회전문을 통과하면서 검은색 플라스틱 상자 앞에서 배지를 흔들어야 합니다. 그러면 딸깍 소리가 나고 표시등이 녹색으로 바뀝니다. 이제 회전문을 밀고 지나갈 수 있습니다.
이 시나리오는 보안의 두 가지 기본 개념인 인증(authentication)과 권한 부여(authorization)를 보여줍니다.
인증(Authentication) vs 권한 부여(Authorization)
인증은 요청을 보내는 사람이 자신이 말하는 그 사람인지 확인하는 과정입니다. 위 이야기에서 제 배지는 제가 회전문에 자신을 인증하는 방법이었습니다. 배지에는 제가 누구인지 식별할 수 있는 번호가 인코딩되어 있었습니다. 또 다른 예로는 공항 보안을 통과할 때 사진이 부착된 신분증을 보여주는 것이 있습니다.
제가 검은 상자 앞에서 배지를 흔들었을 때, 시스템은 제가 누구인지 확인할 수 있었습니다. 이것이 바로 인증입니다. 시스템이 제가 누구인지 알게 되면, 제가 문을 열 수 있는 권한이 있는지 결정해야 했습니다. 제가 들어갈 권한이 있다고 판단되면, 상자의 불빛이 초록색으로 바뀌고 회전문이 잠금 해제되었습니다. 이는 제가 들어갈 권한이 있었기 때문입니다.
서버리스 환경에서 인증 추가하기
API Gateway나 AppSync API에서 AWS의 내장 인증 방법 중 하나를 사용할 수 있습니다. 추가 기능이 필요하다면, 여러 서드파티 서비스 중에서 자체 호스팅이 가능한 것도 있습니다.
-
IAM
Identity and Access Management, 즉 IAM은 AWS의 인증 시스템입니다. AWS 콘솔, CLI, 또는 리소스 간 호출과 같은 관리 작업에 대한 인증 및 권한 부여에 사용됩니다.
-
Cognito
Cognito는 AWS의 기본 사용자 풀 솔루션을 제공합니다. 표준 사용자 이름/비밀번호 방식이나 소셜 인증 제공자를 통해 사용자를 인증할 수 있습니다. 더 높은 보안이 필요하다면, 다중 인증도 처리할 수 있습니다. 또한, AWS는 React 라이브러리를 제공하여 웹 앱에 쉽게 통합할 수 있습니다.
-
서드파티 인증 제공자
AWS에서 제공하는 서비스 외부로 벗어나고 싶다면, 몇 가지 인증 옵션이 있습니다. Auth0이 가장 잘 알려져 있지만, Okta, One Login, FusionAuth와 같은 다른 옵션도 있습니다.
-
API 키
API 키는 가장 단순한 형태의 인증을 제공합니다. 자물쇠의 조합과 비슷합니다. 이 번호를 아는 사람은 누구나 접근할 수 있습니다. 그들이 이 번호를 다른 사람에게 알려주면 그 사람도 접근할 수 있습니다.
-
직접 구현하기
독특한 인증 방법이 필요하거나, 많은 개발자들이 그렇듯 바퀴를 다시 만드는 즐거움을 느끼고 싶다면, 직접 인증 서비스를 만들 수 있습니다. 가장 간단한 방법은 사용자 데이터베이스, CRUD API, 그리고 JWT 토큰을 생성하는 엔드포인트를 만드는 것입니다.
이제 이 옵션들 중 몇 가지를 자세히 살펴보겠습니다.
AWS IAM
AWS IAM은 AWS가 리소스에 대한 접근을 기본적으로 제어하는 방식입니다. 여러분이 AWS 콘솔에 로그인하거나 CLI를 사용할 때, 요청은 IAM에 의해 승인됩니다.
IAM을 사용하여 API Gateway나 AppSync API에 대한 접근을 제어할 수 있습니다. 요청을 보내는 리소스에 역할을 부여하면 됩니다. 런타임에 리소스는 해당 역할을 가정하고, 여러분이 역할에 부여한 권한에 따라 API에 요청을 보낼 수 있습니다.
예를 들어, AppSync API에 접근해야 하는 Lambda 함수를 생성한다면, 먼저 해당 권한을 제공하고 Lambda 서비스가 역할을 가정할 수 있도록 역할을 정의합니다. 함수가 시작되면, 정의한 역할을 가정하고 싶다고 IAM에 알립니다. IAM은 요청이 Lambda 함수에서 왔는지, 그리고 Lambda가 해당 역할을 가정할 수 있는지 확인하여 요청을 인증합니다. 함수가 인증되면, IAM은 AWS 서비스에 요청을 보낼 때 사용할 임시 자격 증명을 제공합니다.
Lambda가 AppSync API에 요청을 보낼 때, IAM에서 받은 자격 증명을 요청과 함께 AppSync로 보냅니다. AppSync는 자격 증명이 요청된 작업을 수행할 권한이 있는지 확인합니다. 자격 증명에 권한이 있다면, AppSync는 요청을 수행하고 결과를 반환합니다.
Cognito Identity Pools를 사용하여 소셜 로그인 토큰을 IAM 역할로 교환할 수 있지만, IAM은 AWS 사용자가 리소스에 대한 권한과 접근을 관리하기 위한 것입니다.
요금
IAM은 AWS의 일부로 제공되는 무료 서비스입니다.
AWS Cognito
AWS Cognito는 서버리스 애플리케이션에 사용자 로그인 기능을 추가하려는 경우 기본 선택지입니다. AWS Cognito는 비밀번호 재설정, 다중 인증, 소셜 계정 연결, 사용자 그룹 등 다양한 기능을 기본적으로 제공합니다.
사용자 풀(User Pools)
사용자가 가입하면 그들의 정보는 Cognito 사용자 풀에 저장됩니다. 사용자는 이후 사용자 이름과 비밀번호로 인증을 진행합니다. 사용자 풀이 사용자를 인증하면 토큰을 반환합니다. 사용자가 API Gateway에 요청을 보낼 때, 이 토큰을 함께 첨부합니다. API Gateway는 자동으로 토큰을 검증하고, 인증된 사용자가 해당 요청을 수행할 권한이 있는지 확인한 후 최종적으로 응답을 반환합니다.
Identity Pools
AWS 콘솔에서 Cognito를 열면 두 가지 옵션이 나타납니다:
- User Pools
- Identity Pools
지금까지는 User Pools에 대해서만 이야기했습니다. 그렇다면 Identity Pools는 무엇일까요?
Identity Pools는 identity federation이라는 서비스를 제공합니다. Identity federation은 인증을 다른 서비스에 위임할 수 있게 해줍니다. 클라이언트는 Apple, Facebook, Google 또는 User Pool과 같은 서비스를 통해 사용자를 인증합니다. 사용자가 인증되면 해당 서비스로부터 토큰을 받아 Identity Pool에 전달합니다.
Identity Pool은 토큰이 유효한 인증 서비스에서 발급되었는지 확인합니다. 토큰이 유효하다고 판단되면, Identity Pool에 연결된 IAM 역할을 사용하는 임시 AWS 자격 증명을 반환합니다. 따라서 여기서 인증 제공자(auth providers)는 인증을 처리하고, Identity Pool은 권한 부여를 관리합니다.
자세한 비교를 원한다면 Cognito User Pool vs Identity Pool 챕터를 참고하세요.
Pricing_5ucp2q7dCupycouDRPfUKv
User Pool 요금은 한 달 동안 서비스와 상호작용한 사용자 수를 기준으로 책정됩니다. AWS는 이를 월간 활성 사용자(MAU, Monthly Active Users)라고 부릅니다. 사용자가 토큰을 갱신하거나 열 번 로그인하더라도 하나의 활성 사용자로만 계산됩니다.
아래 표는 특정 사용자 수에 대한 요금을 보여주지만, 이는 단순히 비용에 대한 일반적인 아이디어를 제공하기 위한 것입니다. 가장 정확한 정보는 Cognito 요금 페이지를 참조하세요.
MAU | 총 요금 |
---|---|
50k | $0 |
100k | $275 |
1 million | $4,415 |
10 million | $33,665 |
마지막으로, 타사 프로바이더에 대해 간단히 살펴보겠습니다.
타사 JWT 인증 프로바이더
Auth0, Okta, One Login, FusionAuth와 같은 타사 프로바이더들은 Cognito보다 더 나은 개발자 경험을 제공하는 경우가 많습니다.
Cognito는 다른 AWS 서비스와의 통합이 뛰어나지만, 단점도 있습니다. 가장 큰 문제는 사용자 풀(User Pool)을 생성한 후에는 많은 속성을 변경할 수 없다는 점입니다. 예를 들어, 사용자 이름을 대소문자를 구분하지 않도록 설정하고 사용자가 Cognito를 통해 가입했다면, 나중에 이 설정을 변경할 수 없습니다. 따라서 소문자 사용자 이름으로 전환하려면 새로운 사용자 풀을 생성하고 기존 사용자를 이전해야 합니다.
대부분의 타사 프로바이더는 Cognito 사용자 풀과 동일한 기본 기능을 제공하며, 추가 기능도 있습니다. 사용자는 OAuth 2를 통해 로그인한 후 토큰을 받게 됩니다. 또한 이러한 서비스들은 Cognito보다 더 나은 사용자 관리 도구를 제공하는 경우가 많습니다. AWS의 Cognito 대시보드는 매우 기본적이고 사용하기 어려울 수 있습니다.
각 프로바이더마다 장단점이 있습니다. 일반적으로 타사 프로바이더를 Cognito 대신 사용할 때의 단점은 요금 청구와 다른 AWS 서비스와의 통합입니다.
대부분의 타사 인증 프로바이더는 AWS 외의 다른 회사에 요금을 지불해야 하므로, 청구가 분리됩니다. 반면 Cognito를 사용하면 각 사용자 풀에 환경(개발, 테스트, 프로덕션 등)을 태그하고, 청구 보고서에서 환경별 리소스를 그룹화할 수 있습니다.
또한 사용자 풀은 커스텀 리소스를 생성하지 않고도 CloudFormation 스택에서 정의할 수 있습니다. 사용자 풀을 생성한 후에는 많은 것을 변경할 수 없지만, CloudFormation 템플릿에 포함되어 있다면 처음부터 쉽게 구축할 수 있습니다.
마지막으로, AWS는 사용자 풀 토큰 검증을 자동으로 처리합니다. 타사 프로바이더를 사용하는 경우, 토큰의 서명을 수동으로 검증해야 합니다.
다음 단계
이번 장에서는 서버리스 앱에서 인증을 처리하는 방법에 대한 높은 수준의 개요를 제공했습니다. 다음 몇 장에서는 다양한 인증 프로바이더를 사용하는 구체적인 예제를 살펴볼 예정입니다. 먼저 Cognito를 사용해 서버리스 앱에 인증을 추가하는 방법부터 시작하겠습니다.
For help and discussion
Comments on this chapter