SW마에스트로에서 본 프로젝트를 MSA
로 설계하며 인증/인가를 어떻게 처리해야할 지 고민하였다.
첫 번째로 우리가 생각한 가장 단순한 방법은 클라이언트-마이크로서비스 간 직접적으로 통신하게끔 하고 모든 마이크로서비스에 JWT
의존성을 구현한 후 각각의 마이크로서비스에서 토큰에 대한 인증/인가를 수행하는 방법이었다.
하지만 모든 마이크로서비스에 동일한 의존성 추가와 동일한 검증 로직을 구현해주어야 한다는 불편함과 JWT
검증을 위한 시크릿 키를 어떻게 모든 마이크로서비스가 공유할 것인가 대한 문제점이 있었다.
두 번째로 고민한 방법은 인증/인가를 수행하는 마이크로서비스 하나에만 JWT
의존성 추가작업과 검증 로직을 구현하고 각 마이크로서비스는 인가가 필요한 API call
이 들어오면 동기적으로 인증/인가 마이크로서비스로 해당 토큰이 유효한 지 확인하는 방법이었다. 하지만 이 방법의 경우 인증/인가가 필요한 API를 클라이언트가 호출할 때마다 매번 동기적으로 인증/인가 마이크로서비스로 요청을 보내 확인해 결합도가 증가한다는 문제점이 있었다.
그래서 우리는 API Gateway 패턴
을 도입하여 위와 같은 문제점을 해결하였다.
API Gateway 패턴
이란, 클라이언트로부터 각 마이크로서비스마다 진입점을 열어주는 것이 아닌 API Gateway
를 통해 단일진입점을 구현하고 이를 통해 다양한 서비스에 접근하도록 한 패턴을 의미한다.
API Gateway
를 통해 단일진입점을 구현하면 여러모로 효율적인 처리가 가능해진다.
인증 / 인가를 각 마이크로서비스에서 처리하는 것이 아닌 API Gateway
에서 한번에 처리 가능하다.
필요에 따라 다른 유형의 클라이언트에게 서로 다른 API 조합을 제공할 수 있다.
이와 관련하여
API Gateway
를 여러 개 두어 클라이언트 유형(모바일, 웹, TV 등)에 따라 단일진입점을 열어두는BFF Pattern
이 있다.
https://fe-developers.kakaoent.com/2022/220310-kakaopage-bff/
https://www.youtube.com/watch?v=95L-_82N1vg
서비스 요청에 대한 응답 지연이 발생하면 정상적인 다른 서비스로 요청 경로를 변경하여 기능이 작동하도록 할 수 있다.
요청/응답 데이터, API 소비자 정보나 에러율, 지연시간, 호출 빈도 등 다양한 매트릭 정보에 대해 로깅을 남길 수 있다.
서킷 브레이커 패턴
을 적용하여 장애가 발생한 서비스를 격리할 수 있다.
API Gateway
를 사용하면 가능한 추가 단일 실패 지점이 만들어진다.클라이언트는 단일진입점을 통해 요청을 보내므로 API Gateway
가 죽으면 모든 마이크로서비스가 전체 다운될 것이다.
API Gateway
가 개발 병목 현상이 될 위험이 있다.개발자는 각 마이크로서비스의 Endpoint를 노출하기 위해 API Gateway
를 업데이트해야 한다. API Gateway 업데이트 프로세스가 가볍지 않다면 개발자는 게이트웨이를 업데이트하기 위해 줄을 서서 기다려야 한다.
하지만 이 추가 호출은 클라이언트 인터페이스가 일반적으로 내부 마이크로서비스를 너무 빈번하게 직접 호출하는 것보다는 적은 영향을 준다.
API Gateway
는 다양한 솔루션을 통해 구현할 수 있다.
Spring Cloud Gateway
Amazon API Gateway
Kong Gateway
service
, ingress
)우리는 마이크로서비스로 설계, 개발하며 많은 학습비용을 치뤘다.
Spring Cloud Gateway
를 사용하고 싶었으나 API Gateway를 개발하는 것 마저 학습하기에는 시간이 부족하여 우리는 Amazon API Gateway
를 통해 API Gateway
를 구현하였다.
우리는 MSA로 설계, 개발하며 프론트-백엔드 간 만나는 최전선은 API Gateway
로, 내부 마이크로서비스들 간 통신로직을 제어하기 위해서 service mesh
솔루션인 istio
를 사용하였다.
클라이언트는 API
를 이용하기 위해서 앞단의 API Gateway
를 거치도록 설계하였고, API Gateway
에서 Lambda Authorizer
를 통해 JWT 토큰을 검증하는데 검증된 토큰의 페이로드에 저장되어있는 대칭키로 암호화한 사용자 식별값을 다시 복호화하여 뒷단의 마이크로서비스에 전달되도록 구현하여 인증 / 인가를 통합적으로 수행했다.
이를 통해 마이크로서비스 간 결합도가 낮은 구조가 되었다.
도메인 주도 설계로 시작하는 마이크로서비스 개발