0w0

핸드폰 인증 제작기

회사에서 진행한 핸드폰 번호 유효성 검증 시스템 구축에 대해 공유하고자 합니다. 기존에 구글 폼 양식을 HTML에 옮겨서 이를 통해 렌탈 서비스를 받고 있었지만, 고객이 입력한 핸드폰 번호가 실제로 사용 가능한 번호인지 확인할 필요성이 생겼습니다. 이를 해결하기 위해 어떤 과정을 거쳤고, 어떻게 구현했는지 설명하겠습니다.

목차

  1. 프로젝트 배경 및 목표
  2. 해결 방안 모색
  3. 구현 과정
  4. 배운 점 및 향후 개선 계획

프로젝트 배경 및 목표

문제점

회사는 현재 구글 폼을 통해 렌탈 서비스 신청을 받고 있습니다. 하지만 고객이 입력한 핸드폰 번호가 실제로 사용 가능한 번호인지 확인할 수 없어서 연락이 되지 않는 경우가 발생했습니다.

목표

해결 방안 모색

초기 접근

처음에는 기존에 사용 중인 카페24 인증 시스템으로 쓰고 있는 NHN KCP를 활용하려 했습니다. 카페24 회원가입 시 사용하는 인증 기능을 사용할 수 있는지 문의했지만, 지원되지 않는다는 답변을 받았습니다.

대안 탐색

이전에 NCLOUD의 지도 API를 사용한 경험을 바탕으로, NCLOUD SENS를 활용하기로 결정했습니다. 이를 통해 SMS 인증 시스템을 구축할 수 있었습니다.

구현 과정

3.1 온프레미스 서버 설정 및 Fastify 사용

Fastify는 Node.js 기반의 웹 프레임워크로, 빠르고 확장성이 좋아 선택했습니다.

fastify.register(require('fastify-cors'), {
  origin: 'https://company-website.com',
  methods: ['POST']
});

3.2 NCLOUD SENS API 연동

HMAC SHA256 알고리즘을 사용하여 API 인증에 필요한 시그니처를 생성했습니다.

const CryptoJS = require('crypto-js');

const url = `/sms/v2/services/${NCLOUD_SERVICE_ID}/messages`;
const timestamp = Date.now().toString();
const method = 'POST';
const space = ' ';
const newLine = '\n';
const accessKey = NCLOUD_ACCESS_KEY;
const secretKey = NCLOUD_SECRET_KEY;

const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secretKey);
hmac.update([method, space, url, newLine, timestamp, newLine, accessKey].join(''));
const signature = hmac.finalize().toString(CryptoJS.enc.Base64);

3.3 프론트엔드 구현 및 hCaptcha 도입

const phoneRegex = /^010\d{8}$/;
if (!phoneRegex.test(inputPhoneNumber)) {
  alert('유효한 휴대폰 번호를 입력해주세요.');
}

3.4 SSL 인증서 자동 갱신 설정

Certbot을 사용하여 SSL 인증서를 발급받고 자동 갱신하도록 설정했습니다.

#!/bin/bash

# SSL 인증서 갱신
sudo certbot renew --quiet

# 인증서 파일 복사
sudo cp /etc/letsencrypt/live/your-domain/cert.pem /home/server/keys/cert.pem
sudo cp /etc/letsencrypt/live/your-domain/privkey.pem /home/server/keys/privkey.pem

# 파일 권한 변경
chmod 644 /home/server/keys/cert.pem
chmod 644 /home/server/keys/privkey.pem

# 서버 재시작
pm2 reload all
your_username ALL=(ALL) NOPASSWD: /home/server/ssl-renew.sh

cron에 등록하기 위해서는 그냥 crontab -e 가 아니라, sudo EDITOR=nvim crontab -e 으로 접근해야 했습니다.

0 8 30 * * /bin/bash /home/server/ssl-renew.sh >> /home/server/cron.log 2>&1

배운 점