사내 서버를 만들기 위해 기존 시스템을 분석해보니 다음과 같은 문제가 있었다.
MSA를 아무 생각없이 적용하는 것은 별로다. 배보다 배꼽이 더 클 수가 있다. 하지만 다음 이유들 때문에 MSA가 적합하다고 여겼다.
즉, 사실상 Auth 서버가 없는 MSA나 마찬가지였던 상황이었다.
천차만별로 난립되어있는 인증/인가를 어떻게 하면 확장성있게 만들 수 있냐가 문제였다. 그리고 기존 시스템과 호환될 수 있으면서 사용자들의 불편함을 해소해야 했다.
그래서 관련 개념을 공부했다.
사용자의 권한을 관리하는 인가는 여러 방식이 있었다. 그 중 대표적인 것은 RBAC와 ABAC였다.
RBAC는 사용자에게 역할을 할당하고, 그 역할에 따라 접근 권한을 제어한다. 가장 널리 쓰인다고 한다. 예를 들어 CUSTOMER, ADMIN 이런 식으로 퉁치는 것이다. 매우 직관적이고 간단하다.
ABAC는 사용자, 리소스, 환경에 대한 속성을 기준으로 세밀하고 동적인 접근 제어를 해준다. 예를 들면, comment:edit과 같은 식이다.
RBAC만으론 현재 요구 사항을 만족시킬 수 없었다.
사이트 A의 CUSTOMER는 매달 경품을 응모할 수 있고, 사이트 B의 CUSTOMER는 매주마다 포인트를 적립할 수 있다고 해보자. 같은 고객이라는 Role이어도 사이트마다 권한이 다르다.
그러면 사이트 A에 가입한 고객에 대해 B에 대한 Role을 부여해야 하나? 그것도 이상하다. 왜 가입한 적도 없는 사이트에 가입을 해야 하는지 납득이 어렵다.
ABAC는 위 RBAC 문제를 잘 해결해준다.
예를 들어 경품:응모:매 달, 포인트:적립:매 주라는 것으로 주면 세밀하게 제어가 가능하기 때문이다.
하지만 문제가 있다. 이러한 정보는 백엔드가 가지고 있어야 할 정보들이다. 프론트엔드는 이 정보들이 알 바가 아니다. 사용자들도 세밀하게 알고 싶어하지도 않는다.
즉, 추상화할 필요가 있다.

그래서 두 가지 방식을 혼합했다. Role과 Permission이라는 개념으로 분리하였다.
Role은 기존 RBAC처럼 역할을 제공한다. 이렇게 하면, 사용자와 프론트엔드는 추상화된 정보를 가질 수 있게 된다.
그리고 Permission에는 Resource, Action 등의 개념을 조합해서 인가를 세밀하게 조정할 수 있을 뿐만 아니라, 확장성있게 추가할 수 있게 했다.
예를 들어, 사이트 A의 고객이 처음에 회원가입할 경우, 사이트 A에 대한 Permission 집합의 권한을 얻게 된다. 그리고나서 사이트 B를 가입한다고 해보자. 이 때, MSA 내 중앙집중식 Auth 서버이기 때문에 또다시 가입하게 할 필요가 없다. 단순히 사이트 B의 Permission 집합을 추가해주기만 하면 된다.