포스트

05.API Gateway 인증

API Gateway의 목적

  • MSA로 서비스를 만들 때 가장 중요한 요소 중 하나로, 서버 앞에서 이들의 기능을 적절하게 라우팅해주기 위해 사용된다.
  • 일반적으로 JSON / REST 기반으로 구성되어 최소한의 기능만 하도록 한다

인증 및 인가

  • 인증
    • 유저의 정보를 확인, 유저가 누구인가(회원가입, 로그인)
    • API를 호출하는 클라이언트의 신분 확인(회원인가 비회원인가)
  • 인가
    • 유저의 권한을 확인(역할, 접근 가능 범위)
    • 클라이언트가 해당 API를 호출해도 되는지의 권한 확인(관리자인가 사용자인가, 어디까지 정보를 호출할 수 있는가)

API 토큰

  • 사용자의 인증 및 인가를 간단히 하기위해 API 토큰을 사용한다.
  • 인증 및 인가 확인 절차가 완료가 되면 사용자가 API를 호출할 수 있는 권한이 있는 토큰을 발급한다.
  • API 서버에서는 발급된 토큰을 통해 사용자의 신분과 권한을 확인하여 API 호출에 대한 허가를 결정한다

토큰 발급
  1. 클라이언트 인증 방식은 id/pw , 공인인증서 , OTP 등 다양하다
  2. API GW는 인증에 대한 요청을 인증서버로 보낸다. 인증 서버는 단순히 인증만 처리하며, 토큰의 발급은 API GW에서 진행한다. 이를 통해 다양한 인증 방식을 적용하고 이를 선택적으로 사용하는 것이 가능하다
  3. 인증이 성공하면 해당 결과를 API GW로 전송한다
  4. API GW에서는 결과에 따라 토큰을 발급한다.

  • 1.. 서버에 권한 내용을 저장하는 토큰
  • 일련의 문자열로 구성된 OAuth 기반의 토큰의 경우에는 API GW 내부에 클라이언트와 발급된 토큰의 정보를 아래와 같이 데이터베이스 형태로 저장한다.
tokenuserrole
abc1234Aliceadmin
xyz789Bobuser
  • 이러한 서버 기반의 토큰 방식의 특징
    • 토큰의 정보를 저장하기 위한 공간이 별도로 필요하여 노력과 비용이 추가된다
    • 전달받은 토큰의 정보를 확인하는 추가작업이 빈번하기 때문에, 일반적으로 이를 빠르게 처리하기 위해 메모리 기반의 고속 스토리지(redis, memcached 등)을 사용한다.
    • 서버에 토큰의 정보가 저장되기 때문에 비교적 안전하게 관리될 수 있다.
    • 토큰은 단순히 문자열로만 구성되며 대부분의 정보는 데이터베이스에서 관리되기 때문에, 많은 정보를 저장하고 이를 수정하기에 용이하다

  • 2.. 토큰 자체에 권한 내용을 저장(클레임)
  • 토큰 내부에 사용자의 정보를 포함(Claim)하는 토큰(JWT, SAML 등)인 경우 토큰 자체에 권한 정보가 저장된다.
  • 특징
    • 별도의 저장소가 필요없기 때문에 노력이나 비용적인 면에서 효율적이다
    • 토큰 자체에 클레임이라는 단위로 이루어진 정보들이 들어가기 때문에, 많은 정보를 넣을 경우 토큰의 길이가 길어져 양을 제한해야 한다
    • 토큰이 한 번 발급되면 이를 수정하는 것이 어렵다(재발급이 더 편하다)
    • 토큰에 정보들이 모두 들어가 있기 때문에 보안적으로 취약할 수 있다. 이를 막기 위해 비교적 짧은 유효기간을 둬서 사용을 제한해야 한다
토큰 인증
  • API GW는 발급된 토큰을 검증해서 API 호출의 승인 여부를 결정한다.

  • 1.. 서버에 토큰 정보를 저장한 경우
    • API 호출을 요청할 때마다 토큰에 해당하는 정보를 서버에서 조회한 후, 이를 비교하여 API 호출 여부를 결정한다
  • 2.. 클레임 기반인 경우
    • 토큰 자체에 정보들이 있기 때문에, 서버에서의 확인 작업이 별도로 필요하지 않다
  • 3.. 기타
    • 모든 서버가 외부로만 구성되지는 않는다
    • 금융권의 경우 서버 구성은 내부서버가 많고, 이러한 상황에서 토큰 방식을 적용하여 불필요한 인증과정을 추가할 필요는 없다
    • 대체로 이런 경우에는 별도의 인증 서비스를 거치지 않고, 외부망과 내부망 사이에서의 보안을 더 강화하는 경우가 많다
    • 외부 서버끼리의 통신에서도 토큰 사용대신에 SSL 기반의 높은 보안성을 갖는 인증 방식을 사용하는 경우도 많다.
토큰 인가
  • 역할에 따라 권한을 부여하는 방식이 많이 사용된다.

  • 1.. 개별 권한을 직접 토큰에 부여한 경우

  • 이렇게 하면 토큰 별로 세밀하게 권한을 부여할 수 있다는 장점이 있다.
  • 하지만 권한이 많아질수록 이를 관리하는 것이 복잡해질 수 있다.
  • 각 권한 별로 요청하는 API를 만들어 놓기도 한다

  • 2.. 역할별로 권한을 토큰에 부여한 경우

  • 역할 별로 권한을 미리 분류해서 해당 역할을 토큰에 부여하는 방식
  • 이를 RBAC(Role Based Access Control)이라고 부른다
  • 장점은 관리 포인트가 줄어든다. 권한의 갯수가 많아질수록 역할별로 공통되게 부여되는 권한을 미리 구분해서 처리하기 때문이다
  • 단점은 세세한 권한 관리는 어렵다

캐시(Cache)를 활용하기

  • 발급된 토큰은 일반적으로 잘 변하지 않는 성격이라고 볼 수 있다.
  • 결국 같은 토큰을 반복해서 인증에 사용하는 것이라고 생각할 수 있다. 따라서 캐시를 사용하면 효율적으로 인증 과정을 처리할 수 있다
  • 왜냐하면 불필요한 통신과정이 생략되기 때문에 속도가 빠르고, 인증 서비스와 통신하는 횟수가 줄어들기 때문에 서버와 통신하면서 발생할 수 있는 장애빈도도 줄어들 것이다.
  • 하지만 실제로 토큰이 변경되는 상황(신규 또는 재발급)에는 캐시된 내역이 오류를 발생시킬 수 있다. 이를 위해서 캐시 또한 적절한 만료시간을 적용해야 한다

2중화의 필요성

  • API GW가 모든 서비스를 전달하는 통로이기 때문에 장애가 발생할 시 치명적인 단일 실패점(SPOF : Single Point Of Failure)가 될 수 있다.
  • 그렇기 때문에 API GW는 반드시 2중화를 해놓는 것이 좋다
참고 블로그

윌리의 탐구생활-API Gateway를 이용한 인증과정