Node.js로 SMS 인증번호 시스템 직접 구현하기

Jae (최재원)
Dec 26, 2018 · 4 min read

Backgrounds

WeGoing Project를 진행하면서, 편의성을 강조하게 되었다. 하지만 동시에 유저의 위치 서비스를 실시간으로 공유하기 때문에 적절한 보안 유지 역시 매우 중요한 부분이었다. 결과적으로 찾게된 해결책은 Local-Login으로 핸드폰 인증 로그인과 Social-Login으로 카카오톡 로그인 2가지 방법이었고, 핸드폰 인증 로그인은 익숙한 ‘SMS 발신’ 키워드가 있는 인증번호 방식이었다.


The Problematic Situation

(1) SMS 인증 번호 !== 휴대폰 본인 인증

‘SMS 인증 서비스’ 구글 검색 결과

구글에서 ‘SMS 인증 서비스'를 검색하면 다음과 같은 결과를 볼 수 있다. 실제로 어플을 사용하면서 휴대본 인증을 할 때를 생각해보면 회원 인증 등을 위해 사용하는 random한 인증번호의 방식과 결제를 이용할 때 사용하는 본인 인증 방식이 있다.

만약 결제를 하게 될 경우, 아래의 경우와 같이 인증된 사업 주체로부터 본인 인증을 받아야 하겠지만, 우리 서비스의 경우 단순히 SMS 인증번호 서비스 만을 사용할 계획이기 때문에 아래의 검색 결과는 적합하지 않았다.

(2) 서비스 제공 업체 vs. 직접 개발

단순 SMS 인증번호 서비스의 경우 특정 사이트에서 해당 서비스를 API 형식으로 제공해주는 경우가 있었다. Docs와 API를 읽어보니 우선은 Node.js 기반의 서버에는 적용하기 어려운 부분이 많아서 사용할 수 없다고 판단을 했다.

더불어 A-Z 까지 개발을 하는 프로젝트 라는 관점에서 타 사이트의 서비스를 이용해서 특정 기능을 구현해내는 것은 적절하지 못하다는 판단을 해서 직접 개발을 하기로 결정하였다.


Naver SENS를 이용한 SMS 인증번호 구현

(1) SMS 발송 서비스 선택

아무리 인증번호 서비스를 직접 구현할 계획이라고 해도, 문자메시지를 발송해주는 서비스를 이용하는 것은 필수적이다. 기본적인 Cloud Platform은 AWS의 서비스를 이용해서 프로젝트를 진행할 계획이었으나, 국내의 유저들을 상대로 문자메시지를 발송하는 것이기 때문에 국내 클라우드 서비스 제공업체에서 제공해주는 문자 메시지 발송 서비스를 이용하게 되었다.

(2) SMS 메시지 발송 API 사용

Naver SENS의 OPEN API(링크)에서 SMS 메시지 발송 POST 만을 사용하게 되었다. 유저가 핸드폰 번호를 입력하고 ‘다음’ 버튼을 누르면 Naver Sens POST 요청이 발생해야 하는 조건을 만들어줘야 했고, 인증번호의 생성과 검증, 그 이후의 DB 작업을 진행하기 위해서는 일련의 과정이 Back-end에서 이뤄져야 했기 때문에 Client에서 Axios로 Naver SENS POST 요청을 직접 보낼 수가 없었다.

그래서 선택한 방법은 SMS 인증번호 요청에 대한 API Call이 발생할 때, request 요청으로 sms 메시지 발송을 진행하는 것이다.

위의 코드와 같이 req.body에 핸드폰 번호가 담겨져서 서버로 요청이 들어오면, request 모듈에 따라 SMS 문자 메시지가 발송되는 방식으로 클라우드 서비스의 SMS 발송 서비스를 이용할 수 있다.

(3) 인증번호 생성과 인증번호 검증

최종적으로 인증번호를 random하게 생성하고, 생성된 인증번호를 확실하게 검증할 수 있는 방법은 다음과 같다.

우선, Math.random() 함수를 사용해 원하는 자릿수의 Random한 인증번호를 만든다.

그 이후, ‘memory-cache’ 모듈을 사용해서 핸드폰 번호를 key값으로, 인증 번호를 value값으로 cache해 둔다. 이 때, 일반적인 서비스들이 사용하는 방식처럼 인증번호 유효시간을 설정해 둘 수 있다.

마지막으로 유저가 인증번호를 확인하는 요청을 보내게 되면 서버는 유저의 핸드폰 번호와 인증번호를 body에서 확인해서, cache에서 핸드폰 번호를 key로 갖는 value값과 유저가 서버에 요청으로 보낸 인증번호의 값이 정확하게 일치하는 지 확인한다.

추가적으로 유저가 인증번호를 받은 이후에 새롭게 인증번호를 요청하게 되는 특수한 예외적인 경우도 있을 수 있기 때문에, 인증번호를 보내기 전에 해당 유저의 핸드폰 번호에 해당하는 cache 값을 지워주는 과정도 필요하다.


Wrap-Up

검색과 적용, 방법을 고민했던 시간보다 처음부터 끝까지 직접 개발을 하자는 결정을 한 이후에 걸린 시간이 훨씬 짧았다. 라이브러리나 외부 API를 사용하는 것이 여러 비용상의 효율성과 결과의 효과성을 높일 수 있는 방법이 될 수 있지만, 이것과 같이 특정한 경우에 있어서는 직접 개발을 하는 것도 효율적이고 효과적일 수 있다.

Jae (최재원)

Written by

email: j.thechois@gmail.com

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade