배경
- 우리가 실생활에서 만나는 소프트웨어, 특히 SaaS에는 접근 제어(Access Control) 로직이 모두 포함되어있어요.
- Notion
- Google Drive
- GitHub
예시
- 또한, 사내에서 활용되는 백오피스 어드민 역시 어느 시점 이후로는 접근 제어 로직이 꼭 필요해요.
- 개발자 권한
- 정직원 권한
- 인턴 권한
예시
- 이러한 접근 제어는 “프론트엔드” 주제는 아니지만, 웹 개발에서 꽤나 복잡도를 많이 갖고 있는 영역이기 때문에, 백엔드 개발자와 API 소통을 하거나하는 일이 생겼을때 활용할 일이 있을거라고 생각해요.
저는 복잡한걸 단순하게 만드는 걸 좋아하는데, 여러분도 그런가요? ㅎㅎ
정의: 인증과 인가, 접근 제어
- 보통 우리는 “인증”과 “인가”를 헷갈리곤 해요. (Authentication vs Authorization)
- “인증”(Authentication)은 현재 요청을 하는 유저가 “누구인지?”를 확인하는 프로세스에요. (프론트에서 여권 체크)
- “인가”(Authorization)는 인증된 유저가 어떤 리소스에 “접근이 가능한지”를 확인하는 정책을 부여해요.
- “접근 제어”(Access Control)는 정책이 부여된 유저가 리소스에 접근하도록 잠금을 해제하는 로직을 의미해요.
예를 들어, 호텔에 체크인하는 여행자를 생각해 보세요. 프론트 데스크에서 등록할 때 예약자 이름이 본인임을 확인하기 위해 여권을 제시해야 합니다. 이는 인증의 예입니다.
호텔 직원이 게스트를 인증하면 게스트는 제한된 권한이 있는 키 카드를 받습니다. 이는 권한 부여의 예입니다. 손님의 키 카드로는 방, 손님용 엘리베이터, 수영장에 액세스할 수 있지만, 다른 손님의 방이나 서비스 엘리베이터는 이용할 수 없습니다. 반면에 호텔 직원은 손님보다 호텔의 더 많은 영역에 액세스할 수 있습니다.
- 인증: 프론트에서 여권을 제시하는 과정
- 인가: 권한이 있는 키 카드를 부여
- 접근 제어: 엘리베이터와 방의 잠금 장치
(홍보) 로그인(인증)은 어떻게 구현하면 되나요?
문제 상황
이거 어떻게 구현해야할까요?
GitHub
- Tony가 X Repo에 코드를 푸시
체크해야하는 사항
- Tony가 X Repo가 속한 P Org에 멤버인가?
- Tony가 X Repo에 권한이 부여된 Q Team의 멤버인가?
- Tony가 X Repo의 Outside Collaborator인가?
Google Drive
- Tony가 Y File에 접근
체크해야하는 사항
- Tony가 Y File에 읽기 권한이 있는가?
- Tony가 Y File이 포함된 상위 폴더에 읽기 권한이 있는가?
- Tony가 Y File이 첨부된 이메일(Gmail)에 접근할 수 있는가?
사내 어드민
- 인턴 권한은 I, J 메뉴로 한정되어있음
- 갑자기 업무 상의 이유로 인턴 K가 정규직 권한이 필요한 Z 메뉴에만 추가로 접근하도록 해야함
- 정규직 권한으로 올려서 당장 해결은 가능하겠지만 접근 제어의 구멍이 생기는 꼴
- 권한 회수 관리에서 실수가 발생 (나중에 인턴 K가 정규직 권한을 들고 있다는 걸 알게 되는 경우)
- 근본적인 해결을 어떻게 하지?