보안의 기본! 인증과 권한 개념 (Authentication & Authorization)


토이 프로젝트들을 개발할 적에는 보안에 신경 써 본 적이 사실상 없는데, 회사에서 웹 개발을 하기 시작하니 REST API의 HMAC 인증을 구현할 일이 생겼어요. 그래서 공부하게 된 내용을 공유하려 합니다. 이번 글에서 다룰 내용은 간단합니다. 보안의 기초 개념 두 가지에요. 영어 단어로만 보고도 구분할 수 있도록 해요 우리.

  • 인증 (Authentication)
  • 권한 (Authorization)

일단 공통점은, 두 가지 다 connection attempt에 대한 일종의 확인이라는 점인데요. authentication은 자신이 누구라고 주장하는 사람을 '누구구나~' 하고 확인하는 절차이고, authorization은 특정 자원에 대한 접근 권한이 있는지 확인하는 절차입니다.

auth

이 사진에 인증과 권한의 관계가 잘 표현되어 있어요. 요청하는 주체는 유저(=user, subject, principal 다 같은 의미)라고 합니다. 유저의 궁극적인 목표는 resource에 접근하는 거예요. 그러기 위해서 인증과 권한의 험난한 절차를 거쳐야 하는 것이죠. Authentication은 본인의 신분을 증명하고 신분증을 받는 것과 같고, authorization은 문지기에게 신분증을 보이고 문을 통과하는 것과 같죠. 참고로 웹에서의 리소스는 웹 페이지, 텍스트, 이미지, 특정 html element 등으로 의미가 다양합니다.

그러면 먼저 authentication에 대해 좀 더 자세히 들여다볼까요.

#인증 (Authentication)

웹에서 인증을 요청하는 유저는 서버에게 두 가지 정보를 제시해야 합니다. 나는 '누구'이며, 내가 그 유저인 '증거'입니다. 가장 쉬운 예시는 아이디와 비밀번호죠.

학자금 대출해주는 한국장학재단 사이트처럼 보안이 중요한 웹사이트 같은 경우에는 아이디-비밀번호로 로그인을 하고 나서 공인인증서 로그인을 또 해야 할 경우가 있죠. 이렇게 이중으로 인증하는 방식을 two-factor authentication이라고 합니다. 줄여서 2FA. 그리고 세 번 이상 인증을 하면 multi-factor authentication이라고 해요. 이외에도 지문 인식, 안면 인식 등의 물리적인 인증 방식도 있습니다.

그리고 이제, authorization의 중요한 포인트 두 가지입니다.

#권한 (Authorization)

#1. 권한 부여 (grant authority)

사용자 인증을 성공적으로 마쳤다면, 이제 이 유저에게 권한을 부여합니다. 예를 들어 같은 웹사이트에 로그인해도 admin 계정으로 로그인하면, 일반 사용자들에게는 보이지 않던 관리 메뉴가 하나 더 생기기도 하죠. 이런 경우에 일반사용자는 일반 권한을, admin은 관리자+일반 권한을 가지고 있는 것입니다. 보안이 제대로 동작하는 웹사이트를 구축하려면 로그인한 유저에게 적절한 권한을 부여하고, 부여된 권한을 잘 관리해야겠죠.

#2. 리소스 가로채기 (intercept)

권한이 있는 유저에게만 리소스를 제공하는 것도, 일단 리소스를 내가 가지고 있어야 가능한 얘기죠. 보안이란 본래 권한이 없는 자들이 원천적으로 리소스에 접근할 수 없도록 막아내는 것입니다. 그런 의미에서 적절한 권한을 가진 자만 해당 자원에 접근할 수 있도록 자원의 외부 요청을 원천적으로 가로채는 것(Intercept)은 authorization의 중요한 원칙입니다.

#References