본문 바로가기
ETC/System Design

MSA 기반 환경에서의 인증과 인가 - 2. 인증 및 인가 프로세스

by devson 2021. 5. 29.

앞서 MSA 환경에서의 어떤 식으로 인증과 인가 시스템을 구현할 것인가에 대해 대략적인 개요를 살펴보았다.

이번 포스팅에서는 구체적으로 어떤식으로 인증과 인가 프로세스를 밟아 나가는지에 대해 살펴보자.

 

인증 (Authentication)

흔히 로그인이라고 부르는 인증(Authentication)은 특정 계정에 대해 소유를 확인하는 과정이다.

흔히 ID, Password 를 사용하거나 OAuth 등을 사용하여 인증 과정을 거친다.

 

1. Client 에서 ID, Password 와 같은 인증 수단의 데이터를 담아 인증(로그인) 요청을 보내면 API Gateway에서 해당 요청을 인증 서버에 라우팅 할 것이다.

 

2. 이때 인증 서버에서 인증이 성공했을 때 Access Token과 Refresh Token을 응답한다.

 

이제 Client는 발급받은 Access Token을 통해 특정 리소스 서버에 요청을 보내거나

Access Token 만료 시 Refresh Token을 통해 새로운 Access Token과 Refresh Token을 발급받을 수 있다.

 

인가 (Authorization)

인가(Authorization)는 Client가 Resource Server로 요청을 할 때 해당 요청을 할 수 있는지 권한을 확인하는 과정이다.

 

나는 JWT Access Token를 사용하였기 때문에 요청 Authorization header(꼭 여기에 담진 않아도 된다)에 Access Token을 담아 요청을 보내면 서버에서 일련의 인가 과정을 거쳐 Resource Server에 요청을 라우팅하도록 하였다.

 

1. Client가 Access Token을 담아 API Gateway로 요청을 보낸다.

그러면 API Gateway가 Client에서 보낸 요청을 Authorizer로 보내 요청에 있는 Access Token이 해당 시스템에서 발급되었는지(Secret 확인), 만료되진 않았는지를 확인한다.

 

(나는 AWS API Gateway를 사용했기 때문에 위와 같이 API Gateway와 Authorizer를 분리한 형태로 구성하였다 참고)

 

2. Authorizer에서 Access Token이 유효하다고 판단되면 Access Token의 Payload에 있는 데이터(User ID 등)를 Request에 담아 다시 API Gateway로 보내고, 이후 API Gateway는 요청에 해당되는 Resource Server로 요청을 라우팅한다.

 

요청을 받은 Resource Server는 넘겨 받은 Access Token Payload 데이터를 통해 내부적으로 해당 요청의 권한을 확인한다.

(e.g. 특정 리소스의 owner 인지를 확인, 특정 등급 이상이어야 사용할 수 있는 기능에 대해 등급을 확인)

 

여기서 Authorizer에서 Access Token을 확인하고 추가로 Access Token Payload를 요청에 담아서 Resource Server에 라우팅하는 이유는

  • Access Token 그대로 Resource Token에 보내게 되면 Access Token의 Payload를 확인하는 코드를 Resource Server 마다 추가해야하기 때문에 코드 및 기능이 중복된다.
  • Resource Server 애플리케이션 요청이 편리하다.
    만약 Resource Server 요청 시 Access Token을 보낸다고 하였을 때, e2e 테스트를 위해서 Access Token을 발급해서 테스트 요청을 보내야한다.
    또한 다른 한 Resorce Server에서 다른 Resource Server로 요청을 보낼 때에도 Access Token을 발급하거나 요청으로 들어온 Access Token을 그대로 요청에 담아서 보내야한다.

물론 Resource Server가 Access Token 내부 데이터를 꺼내 쓸 순 있겠지만,

개발 효율성을 따졌을 때 Resource Server에서는 Access Token에 담긴 Payload를 받아 이를 통해 유저 권한을 처리하는 것이 좋다고 판단하여 위와 같이 구현하였다.

 

3. 요청을 처리한 Resource Server는 API Gateway에게 응답을 하고 이 응답은 최종적으로 Client에게 전달된다.

 


위와 같이 어떤식으로 인증과 인가 프로세스를 밟아 나가는지에 대해 살펴보았다.

 

다음에는 혹시모를 토큰 탈취에 있어 어떤 식으로 대처를 할 것인지에 대해 알아보도록 하겠다.

댓글