며칠 전, 우리 대학을 위해 설계된 노트 공유 플랫폼인 Makaut Buddy 라는 오픈 소스 애플리케이션 과 관련된 문제로 동료 몇 명이 저에게 접근했습니다. 이 플랫폼은 학생들이 탑 노트, 과거 시험 문제 및 YouTube 튜토리얼을 효율적으로 공유할 수 있도록 돕는 것을 목표로 합니다. .
리소스 업로드 시스템을 성공적으로 개발했지만 승인된 개인만 콘텐츠를 업로드할 수 있도록 하는 데 어려움을 겪었습니다.
아래 데모에서 볼 수 있듯이 모든 사용자는 가입 후 리소스를 생성할 수 있습니다. 이는 사용자가 업로드하는 내용을 규제할 수 없기 때문에 큰 문제가 되었습니다. 일부 사용자는 유해하거나 충격적인 콘텐츠를 업로드했을 수도 있습니다.
처음에는 관리자 역할을 정의하고 특정 그룹의 개인에게 관리 권한을 부여했습니다. 그러나 역할 수가 늘어나면서 코드가 점점 복잡해지고 관리하기 어려워졌습니다.
RBAC 구현 외에도 액세스 승인 요청 시스템도 도입했습니다. 이 시스템을 통해 콘텐츠를 업로드하려는 사용자는 먼저 액세스를 요청해야 하며, 그런 다음 관리자가 이를 승인하거나 거부할 수 있습니다. 이렇게 추가된 보안 계층은 Makaut Buddy의 콘텐츠 무결성을 유지하는 데 도움이 됩니다.
이 기사에서는 프로그래밍 언어로 JavaScript를 사용하고 프레임워크로 Next.js를 사용했습니다. 그러나 여기에서 논의된 개념은 언어별로 국한되지 않으며 원하는 프로그래밍 언어로 구현할 수 있습니다.
이 기사가 끝나면 애플리케이션에서 기본 RBAC 모델을 구현하는 방법을 알게 될 것입니다.
그 말을 듣고 뛰어 들어 봅시다!
아침에 학교로 달려가던 때를 기억하시나요? 신분증을 확인하는 경비원이 인증의 완벽한 예입니다. 그들은 캠퍼스에서 허용되는 학생으로서 귀하의 신원을 확인하고 있습니다. 하지만 이는 단지 첫 번째 단계일 뿐입니다. 신원이 확인된 후에도 아무 교실에나 들어가지는 않을 것입니다. 그렇죠? 승인이 들어오는 곳입니다.
귀하의 수업 일정을 귀하의 승인으로 생각하십시오. 귀하의 역할(해당 수업에 등록한 학생)에 따라 특정 영역(교실)에 대한 액세스 권한을 부여합니다. 학생이라 할지라도(인증된) 교직원 휴게실이나 도서관의 출입 제한 구역에 입장할 수 없습니다.
인증과 권한 부여의 차이점은 "당신은 누구입니까?"라고 묻는 것과 같습니다. vs “당신은 무엇을 할 수 있나요?”
권한 부여는 개인이 권한이 없는 작업을 수행하는 것을 방지하므로 모든 조직에서 중요합니다. 이는 조직의 안전을 보장하고 손실을 방지하는 데 도움이 됩니다.
위의 문장을 예를 들어 설명해 보겠습니다.
회사에는 경험이 풍부한 선배 엔지니어도 있고, 아직 기초를 익히고 있는 인턴도 있습니다. 수석 엔지니어와 인턴이 동일한 수준의 권한을 갖고 있다면 어떤 재앙이 발생할지 상상할 수 있습니다. 아직 배우고 있는 인턴은 회사가 대가를 치르게 될 실수를 무의식적으로 저지를 수도 있습니다. 이와 같은 상황에서는 권한이 개인에게 할당되지 않고 역할에 할당되기 때문에 역할 기반 액세스 제어 모델이 가장 잘 작동합니다. 예를 들어 수석 엔지니어나 기술 책임자만 리소스를 삭제할 수 있지만 모든 인턴은 리소스를 보고 관리할 수만 있습니다.
다음으로 애플리케이션에서 RBAC를 구현하는 방법을 살펴보겠습니다.
먼저 역할을 정의하고 각 역할에 권한을 할당해야 합니다.
참고: 역할은 조직 내에서 누군가가 갖는 직위 또는 목적입니다. 해당 역할에 할당된 권한이나 특권을 기반으로 개인을 구별할 수 있도록 역할이 필요합니다.
애플리케이션의 각 사용자에게 역할을 할당하는 방법이 필요합니다. 이는 일반적으로 사용자가 가입한 후에 수행됩니다.
사용자가 수행하려는 작업을 수행하고 사용자의 인증을 확인하는 API가 백엔드에 필요합니다. 아래 다이어그램을 보면 더 잘 이해할 수 있습니다.
그러나 우리는 처음부터 전체 모델을 구현하지는 않을 것입니다. 대신, 우리는 허가 설정의 전체 프로세스를 매우 원활하고 효율적으로 만들어 주는 Permit이라는 제3자 허가 도구를 사용하여 귀하가 정말로 중요한 기능을 사용할 수 있도록 할 것입니다.
아래 다이어그램은 Permit을 활용하여 애플리케이션에서 RBAC를 구현하는 방법을 보여줍니다.
이 섹션에서는 Permit을 사용하여 RBAC(역할 기반 액세스 제어)를 구현하는 단계를 안내합니다.
RBAC 모델을 설정하기 위해 Permit을 사용하므로 먼저 Permit 계정과 작업 공간을 만들어야 합니다.
이제 애플리케이션에서 액세스를 제어하려는 엔터티인 리소스를 생성해야 합니다.
예를 들어, 메모 작성 애플리케이션에서 리소스는 Notes이고 작업은 만들기 , 읽기, 업데이트 및 삭제일 수 있습니다.
리소스를 생성하려면:
위의 예에서 리소스 이름은 Notes이고 사용자가 수행할 수 있는 작업은 만들기, 읽기, 업데이트 및 삭제입니다.
리소스를 생성한 후에는 애플리케이션에 존재할 역할을 정의해야 합니다.
이 경우 애플리케이션은 대학의 노트 공유 애플리케이션이므로 역할은 다음과 같습니다.
두 역할을 모두 생성했으면 이제 아래와 같이 정책 편집기에서 각 역할이 수행할 수 있는 작업을 할당해야 합니다.
이제 Permit 계정이 구성되었으므로 Permit과 통신하기 위한 백엔드 API 생성을 시작할 수 있습니다. Permit에서 제공하는 Node.js SDK를 사용하겠습니다. 허가 문서에서 선호하는 프로그래밍 언어에 대한 SDK를 찾을 수 있습니다.
사용자 동기화 및 기본 역할 할당
먼저, 애플리케이션에 등록하는 각 사용자가 허가 디렉터리에 동기화되고 기본 역할인 학생이 할당되었는지 확인해야 합니다.
이를 위해서는 아래와 같이 백엔드 API를 생성해야 합니다.
이 API는 다음 두 가지 작업을 수행합니다.
createUser
API를 사용하여 새 사용자를 생성합니다.assignRole
API를 사용하여 기본 역할을 할당합니다.
Permit 문서 에서 Permit이 제공하는 모든 API에 대해 자세히 알아볼 수 있습니다.
사용자 역할 가져오기
다음으로, Permit.io 에서 사용자 역할을 가져와 이를 다시 프론트엔드로 보내는 백엔드 API를 생성해야 합니다.
아래 표시된 API는 permit.api.users.get(user_key)
를 사용하여 사용자를 가져옵니다.
이 API는 특별한 역할을 가진 사람들만 볼 수 있도록 프런트 엔드 구성 요소를 조작할 수 있는 사용자 역할을 가져옵니다.
특정 역할을 가진 사용자가 작업을 수행할 수 있는지 확인하려면 allowed.check() 함수를 확인할 수도 있습니다.
이로써 우리는 Permit을 사용하여 RBAC 모델을 성공적으로 구현했습니다. 이제 백엔드 경로를 선택한 프런트엔드 프레임워크 또는 라이브러리와 통합하여 설정을 완료할 수 있습니다.
설정을 완료하려면 사용자가 역할 업그레이드를 요청할 수 있는 구성 요소가 필요합니다.
Permit 요소는 애플리케이션에서 액세스 공유를 쉽게 만들어주는 사전 구축된 내장형 UI 구성 요소 모음인 "Permit Share-If"의 일부입니다. 완전한 기능의 액세스 제어를 제공하도록 설계되어 사용자에게 권한 관리를 간단하고 안전하게 위임할 수 있습니다.
그것이 우리가 요소를 만든 것입니다.
요소를 사용하기 전에 사용자를 허가 요소에 로그인하기 위한 백엔드 API를 생성해야 합니다.
참고: 가능한 한 빨리, 가급적이면 가입 직후에 사용자에 로그인하는 것이 중요합니다.
이제 코드를 살펴보겠습니다.
/api/v1/login_permit/?userkey=user_key
엔드포인트에서 제공되는 API 코드:
로그인을 구현하기 위한 프런트엔드 코드는 다음과 같습니다.
이것이 바로 우리가 코드를 설정한 것입니다.
이제 아래와 같이 허가 대시보드로 이동하여 사용자 관리 iframe과 액세스 요청 iframe을 모두 복사하면 됩니다.
이제 코드를 얻었으면 사용자에게 요소를 표시하려는 프런트엔드에 iframe
추가해야 합니다. 다음을 수행해야 합니다.
이를 통해 우리는 사용자가 역할 업그레이드를 요청할 수 있고 관리자는 이러한 요청을 승인하거나 거부할 수 있는 액세스 승인 시스템을 성공적으로 설정했습니다.
이 데모는 "관리자" 역할을 가진 사용자가 업로드 위젯에 액세스하는 방법을 보여줍니다.
이 데모는 "학생" 역할을 가진 사용자가 업로드 위젯을 볼 수 없고 "관리자" 역할로의 업그레이드를 요청할 수 있는 방법을 보여줍니다.
이 데모에서는 권한이 있는 사용자가 역할 업그레이드 요청을 승인하는 방법을 보여줍니다.
이 데모는 사용자가 "학생"에서 "관리자"로 업그레이드된 후 업로드 위젯에 대한 액세스 권한을 얻는 방법을 보여줍니다.
그게 다야!
여기까지 읽어주셔서 감사합니다.
이 튜토리얼에서는 인증을 살펴보고 모든 애플리케이션에서 인증이 매우 중요한 이유를 이해했습니다. 또한 애플리케이션을 보호하고 역할에 따라 사용자 액세스를 제어하기 위해 Permit을 설정 및 구성하는 방법도 살펴보았습니다.
이 기사는 인증 및 RBAC 모델의 빙산의 일각에 불과합니다. 보다 세분화된 권한 부여를 위해 ABAC 및 ReBAC를 살펴볼 수 있습니다.