안녕하세요. 볼드나인 백엔드 개발자 황성현입니다.
회원을 관리하는 서비스를 개발하다 보면 특정 회원의 권한에 따라 기능이나 정보의 노출 여부를 관리해야 하는 상황을 높은 확률로 마주하게 됩니다.
저희 볼드나인에서 운영 중인 ezstorage 서비스에도 관리자, 매니저, 구성원 등 여러 가지 권한을 나누어 두고 있는데요. ezstorage의 기능이 다양해지고 다루는 정보의 규모가 점점 커짐에 따라 권한 관리 체계를 개편할 필요성을 느껴 몇 가지 방법을 고민해본 경험을 공유하고자 합니다.
여러가지 권한 관리 방법들
사용자들의 권한을 관리하는 방법은 정답이 있는 분야가 아니라서, 찾아보니 정말 다양한 방법들이 있었는데요. 그중 유심히 봤었던 몇 가지 방법을 살펴보겠습니다.
1.
사용자에게 부여된 ‘권한 등급’을 DB에 갖고 있다가 로그인 시 반환하는 토큰이 갖고 있는 정보에 포함시켜 클라이언트에서 확인할 수 있도록 하는 방법
: 서버에서는 사용자의 권한 등급 정보만을 반환하고, 클라이언트 단에서 권한을 관리하고자 하는 각 메뉴/기능 들을 렌더링 할 때마다, 서버에서 보내줬던 사용자의 권한 등급 정보를 검토하고 노출 여부를 결정하는 방법. 사실상 클라이언트에게 권한 관리를 위임하는 느낌입니다.
2.
사용자에게 부여된 ‘권한 등급’ 과 ‘기능/메뉴’를 결합하여 여기에 접근 가능 여부 등을 외부 저장소에 저장하여 관리하는 방법
: ezstorage에서 기존에 사용하던 방식과 유사한 방식이긴 하지만, ezstorage는 사용자의 권한과 사용자가 속한 단체의 권한을 조합하여 접근 여부를 판단하기에 관리하고자 하는 기능과 묶어서 권한을 관리할 수 있는 좀 더 복잡한 방법의 도입이 필요하였습니다.
3.
서버에서 접근할 수 있는 기능이나, 메뉴 등에 대한 정보를 담아 해당 사용자가 로그인할 때, 클라이언트에게 이 정보들을 반환하는 방법
: 주로 클라이언트에서 노출할 메뉴트리 등을 관리하고자 할 때 적용하는 방법입니다. 객체 형식으로 접근 가능한 메뉴, 기능들의 목록을 담아 클라이언트에서 메뉴를 렌더링하거나 기능을 노출시킬 때 사용하는데 권한 별로 사용 가능한 메뉴, 기능들이 유사하고 일부만 낮은 권한 등급이 사용하지 못하는 방식으로 관리하려 한다면 도입하기 좋은 방법입니다.
// 권한 트리 형식으로 갖는 방법 예
{
"a기능": true,
"b기능": false,
"c기능": {
"c-1기능": true,
"c-2기능": false
}
}
JSON
복사
구글에서 사용하는 권한 관리 방식 (Zanzibar)
사실 이 글을 작성하는 시점에도 아직 ezstorage 서비스에 어울리는 적절한 권한 관리 방식을 찾고 있는 과정에 있는데요. 방법을 찾다 보니 여러 가지 서비스를 운영하면서 동시에 여러 서비스가 같은 자료나 기능에 접근할 수 있는 권한을 부여하거나 차단해야 하는 상황에 있는 회사들은 어떤 방법을 도입하고 있는지 궁금해졌습니다.
찾아본 방법들 중에서 구글이 사용하는 관한 관리 방식인 Zanziba가 가장 인상 깊었습니다. 위 이미지는 Zanziba를 소개하는 페이지(https://zanzibar.academy/) 에 나와있는 예시인데요, 붉은색으로 표시된 ‘사용자명’ 핑크색으로 표시된 ‘관계’ 파란색으로 표시된 ‘데이터 이름’을 나타냅니다. 여기서 Zanziba가 동작하는 방식을 모두 설명할 수는 없겠지만, 사용자와 데이터 그리고 이들을 이을 관계를 함께 저장함으로써 마치 그래프 탐색하는 느낌으로 데이터에 대한 권한을 찾아나갈 수 있는 구조가 매력적이었습니다.
결론
지금까지 여러 권한 관리 방법과 구글에서 사용 중인 zanzibar을 아주 간략하게 살펴보았는데요, 정답이라고 말할만한 방법이 딱히 없고 각자의 장단점들이 있는 영역인 만큼 ezstorage 서비스의 환경을 잘 고려해서 효율적인 방법을 적용할 수 있도록 노력하겠습니다!
읽어주셔서 감사합니다.