사내 서버를 만들기 위해 기존 시스템을 분석해보니 다음과 같은 문제가 있었다.
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 집합을 추가해주기만 하면 된다.