졸업과제를 진행하며, 사용자 인증에 대한 부분을 구현하게 되었다.
막상 구현하려니 막막해서 현존하는 기술을 조사하고,
해당 기술들을 바탕으로 새로운 기술에 대한 아이디어를 뽑아내보기로 결정했다.
Factor?
사용자의 신원을 확인하는 방식에 따라 3가지의 Factor 로 분류를 한다.
- 지식 기반 : 사용자만 알고 있는 것
- ID, PW 등의 대중적인 인증 방식이 여기에 해당한다.
- 미리 설정해놓은 질문 답변 또한 지식 기반 인증에 해당한다.
- 소유 기반 : 사용자만 갖고 있는 것
- OTP 서비스, 보안카드 등이 여기에 해당한다.
- 공인인증서, USB 토큰 등의 인증서 개념도 해당 인증 방식에 해당한다.
- 속성 기반 : 사용자만의 고유한 속성
- 지문, 홍채 등의 다른 사람과 반드시 구별되는 속성을 통한 인증 방식이다.
- 기술의 발전으로 목소리 인증, 정맥 인증 등의 새로운 인증 방식이 사용되기도 한다.
MFA?
과연 ID, PW만 받아서 본인을 확인하는 방식은 보안 위협으로부터 안전할까? 결코 아니다.
예를 들어 지식 기반의 factor 하나만 사용하여 신원을 인증한다고 가정해보자.
누군가가 해당 factor를 알게 된다거나, 탈취한다면 그 정보는 더 이상 사용자만 아는 것이 아니게 된다.
위와 같은 상황에 대한 대비책이 항상 준비가 되어있어야 위협으로 부터 안전을 보장받을 수 있을 것이다.
따라서 기존에는 사용자의 ID, Password 정도만 받아서 인증하는 “One factor” 방식이 대부분이었다면,
보안이 점점 중요해지면서 여러 factor를 사용하여 신원을 인증하는 방식의 중요성이 대두되었다.
그 방식이 바로 MFA(Multi Factor Authentication), 멀티 팩터 기반 인증이다.
아직까지는 대부분 2가지의 방식을 동시에 사용해, 2FA(Two Factor Authentication)이라고도 부른다.
FIDO?
FIDO(Fast Identity Online)는 국제 인증 표준 중 하나이다.
기존의 지식 기반, 소유 기반 인증 방식들은 모두 분실에 매우 취약했다.
하지만 속성 기반의 인증 방식을 통해 걱정 없이 보안을 유지하도록 하는 표준이다.
아래의 두 가지 방식으로 나누어진다.
- UAF(Universal Authentication Framework)
- ID, PW 방식을 생체 인증으로 대체해 서버에 접속하도록 한다.
- U2F(Universal Second Factor)
- ID, PW 방식으로 1차 인증 후 두 번째 factor를 이용해 한번 더 인증을 받는다.
- 위에서 설명했던 MFA와 동일한 방식이다.
위와 같이 보안 인증 절차에 표준이 만들어질 정도로 안전한 인증 절차는 매우 중요하다.
프로젝트 적용 방식
현재 진행중인 졸업과제의 주제에 사용자 인증 기술 개발이 들어가기 때문에,
과연 어떤 방식으로 사용자 인증 기술을 적용 시킬 수 있을지, 새로운 아이디어는 없을지 고민을 하게 됐다.
당연히 보안을 위해 MFA 방식을 채택할 것인데, 구체적으로 어떤 방식을 사용할 지가 문제였다.
기본적으로 권한에 따라 인증 방식을 강화할 계획이기 때문에, 먼저 다양한 인증 방식을 조사했다.
- OTP(One Time Password)
서버에서 일회용 비밀번호를 생성해 제공하는 서비스이다.
보통 사용자가 보유하고 있는 스마트폰과 같은 기기를 통해 비밀번호가 제공된다.
그렇기 때문에 등록된 기기에 대한 소유권자만이 입력을 통해 인증을 할 수 있다.
해당 비밀번호를 특정 시간 안에 서버에 입력하면, 일치 여부를 통해 인증을 진행한다.
꽤 간단하고 효율적인 방식이기 때문에, 대부분의 인증 절차에서 채택하고 있다.
비밀번호 생성 방식으로는 아래와 같은 방식들이 사용된다.
- HOTP(HMAC-based OTP)
- HMAC은 Hash-based Message Authentication Code를 의미한다.
- HOTP는 Message가 아닌 Counter를 기반으로 암호를 생성한다.
- 암호화에 해시 함수인 SHA-XXX 함수가 사용된다.
- 결과로 6자리의 임의의 정수를 반환하게 된다.
- TOTP(Time-based OTP)
- 위의 HOTP를 기본 아이디어로, Counter 대신에 Timestamp를 기반으로 암호를 생성한다.
- 위와 동일하게 SHA-XXX 함수가 암호화에 사용된다.
- 위와 동일하게 결과로 6자리의 임의 정수를 반환한다.
OTP 방식은 반드시 사용할 계획이나, 비밀번호 생성 방식을 결정하는 것이 관건이다.
- 그냥 Random한 난수를 발생시킬 것인지?
- 위와 같은 암호화 방식을 사용해서 서비스를 제공할 것인지?
- 개인 QR 코드 발급?
권한을 교수와 학생으로 나눈다고 가정을 했을 때, 그 권한을 어떻게 구분할 것인가?
간단히 교수들에게는 개인적으로 교수 전용 QR 코드를 발급해주고, 인증 시 해당 코드를 입력하는 건?
원래 ID, PW는 지식 기반이지만 해당 정보를 바탕으로 소유 기반의 인증 방식으로 전환한 것이다.
아래와 같은 시나리오를 생각해보았다.
- 교수는 최초 회원가입 시, 관리자에게서 QR 코드를 발급 받아야 한다.
- 해당 QR 코드를 카메라로 찍으면, 코드가 텍스트로 나오며 복사가 가능하다. - 코드는 관리자가 교수가 가입한 비밀번호를 기반으로 생성한다. - 물론 해당 비밀번호는 DB에서 BEncrypt를 통해 암호화 된 문자열이며, 복호화가 불가능해야 한다. - 코드는 해당 비밀번호를 한번 더 Encrypt한 코드이면 어떨까?
- 교수도 OTP를 사용해야 하기에, “OTP+해당 코드”를 동시에 입력받아 검증하게 하면 어떨까? - 대신 해당 코드 중 Random한 4자리를 뽑아 해당 자리에 맞게 값이 들어왔는지 검증한다. - 은행에서 사용하는 보안코드와 같은 원리.
아래와 같은 문제점들이 예상된다.
- QR 코드 분실 시 인증이 불가능하다.
- QR 코드 도난 시 보안이 뚫리게 되는 것이다.
- 해당 QR에 대한 정보는 DB에서 보관해야 하기에, 탈취의 위험이 있다.
- 복호화가 가능하다면, 바로 개인 정보가 위협을 받을 것이다.
- 사용자에게 있어서 편의성이 떨어진다.
- 기기를 이용한 인증?
현재 진행중인 졸업 과제에서는 라즈베리 파이를 통한 RSS 값 측정을 진행한다.
그럼 해당 라즈베리 파이를 이용해서 인증을 진행할 수는 없을까?
만약 인당 1개씩 정해진 라즈베리 파이를 지급한다면, 가능할 것이다.
아래와 같은 시나리오를 생각해보았다.
- 모든 사용자는 최초로 라즈베리 파이를 지급 받는다. - 라즈베리파이마다 고유 코드가 이미 기록이 된 채 지급된다.
- 사용자 별로 해당 라즈베리파이 고유 코드를 DB에 기록한다.
- 서버에서는 라즈베리파이를 켤 것을 요청한다.
- 해당 라즈베리파이가 켜질 때 동시에 서버에 고유 코드와 함께 요청을 보낸다.
- 서버에서 해당 사용자와 라즈베리파이 고유 코드가 맞는지 비교한다. - 가 로그인 상태로 만들어 헤더로 사용자 정보는 넘어가도록 한다.
- 코드가 맞으면, 메인페이지로 이동하며 아니면 강제로 로그아웃 시킨다.
아래와 같은 문제점들이 예상된다.
- 라즈베리파이 분실 시 인증이 불가능하다.
- QR코드와 동일하게 라즈베리파이 도난 시 보안이 뚫리게 된다.
- 라즈베리파이의 고유 코드가 탈취당하면 보안이 뚫린다.
- 기기에 너무 종속적이다.