마이크로서비스 인증/인가 패턴
Updated:
- 다양한 서비스 등록, 탐색 위한 Service registry , Service discovery 패턴
- 서비스 단일 진입을 위한 API 게이트웨이(gateway) 패턴 & BFF(Backend For Frontend) 패턴
- 외부 구성 저장소 패턴
- 마이크로서비스 인증/인가 패턴
- 장애 및 실패 처리를 위한 서킷 브레이크 패턴
- 모니터링과 추적 패턴
- 중앙화된 로그 집계 패턴
- 서비스 매시(Service Mesh) 패턴
마이크로서비스 인증/인가 패턴
여러 개의 마이크로서비스에 대한 인증/인가 등 접근 제어는 어떻게 구현해야 할까? 각 서비스가 모두 인증/인가를 중복으로 구현한다면 비효율적이다. 따라서 마이크로서비스 인증/인가를 처리하기 위해서는 일반적으로 다음과 같은 패턴들을 활용한다.
-
중앙 집중 식 세션 관리
기존 모노리스 방식에서 가장 많이 사용했던 방식은 서버 세션에 사용자의 로그인 정보 및 권한 정보를 저장하고 이를 통해 어플리케이션에 인증/인가를 판단하는 것이다. 그렇지만 마이크로서비스는 사용량에 따라 수시로 수평 확장할 수 있고 로드 밸런싱이 되기 때문에 세션 데이터가 손실될 수 있다. 따라서 마이크로비스는 각자의 서비스에 세션을 저장하지 않고 공유 저장소에 세션을 저장하고 모든 서비스가 동일한 사용자 데이터를 얻게 한다. 보통 세션 저장소로 레디스(Redis), 맴캐쉬드(Memcached)를 사용한다.
-
클라이언트 토큰
세션은 서버의 중앙에 저장되고 토큰은 사용자의 브라우저에 저장된다. 토큰은 사용자이 신원정보를 가지고 있고 서버로 요청을 보낼 때 전송되기 때문에 서버에서 인가 처리를 할 수 있다.JWT(Json Web Token)은 토큰 형식을 정의하고 암호화 하며 다양한 언어에 라이브러리를 제공하는 공개 표준(RFC 7519)이다. 토큰을 통한 사용자 인증 흐름은 다음 다이어그램과 같다.
- 브라우저가 서버에 로그인이름과 패스워드로 인증을 요청한다.
- 서버는 인증 후 토큰을 생성하고 브라우저에 토큰에 사용자 정보의 인증/인가 정보를 포함에 전송한다.
- 브라우저는 서버 리소스 요청 시 토큰을 같이 보낸다. 서버의 서비스는 토큰 정보를 확인후 자원 접근을 허가한다.
-
API 게이트웨이를 사용한 클라이언트 토큰
사용자 인증 프로세스는 토큰 인증 프로세스와 유사하다. 차이점은 API 게이트웨이가 외부 요청의 입구로 추가된다는 것이다. 또한 인증/인가에 처리를 위한 별도의 전담서비스를 만들어서 다른 서비스의 인증/인가 처리를 위임 시킬 수 있다. 이런 서비스 Auth서비스라 하는데 API 게이트웨이와 연동해서 인증 인가를 처리한다. Auth서비스를 사용하면 각각의 리소스 서비스가 자체적으로 인증 인가를 처리하지 않고 순수 업무처리에 집중할 수 있다.
아래 그림을 통해 동작 메커니즘을 살펴보면
- 클라이언트가 리소스 서비스에 접근을 요청하면 API 게이트웨이는 Auth서비스에게 포워딩한다.
- Auth 서비스는 해당 요청이 인증된 사용자인지(인증) 해당 리소스 접근 권한이 있는지 (인가)확인하고 모두 가능하다면 리소스에 접근 가능한 증명서인 토큰을 발급한다.
- 클라이언트는 다시 액세스 토큰을 활용하여 접근을 요청한다.
- 그럼 각각의 리소스 서비스는 이런 요청이 액세스 토큰을 포함하고 있는지 판단하여 리소스를 허용한다