본문 바로가기

Infra/Cloud

[Cloud] SENS Service를 이용한 문자 인증 API 구현하기

[Naver Cloud] SENS Service를 이용한 문자 인증 API 구현


개요

  Naver Cloud의 서비스 중 하나인 SENS(Simple & Easy Notification Service)를 이용하여 문자 인증 API를 구현한다.

 

목차

 

소개

 1. NAVER CLOUD PLATFORM 회원가입 및 기본 프로젝트 생성 

  먼저 위의 링크로 이동하여 NAVER CLOUD PLATFORM에 회원가입을 진행하여준다. 그 후 마이페이지에 들어가, 서비스를 이용하기 위해서 결제 수단을 등록하여 준다.

 

  그 후, 위의 네모박스 안의 Simple & Easy Notification Service를 클릭하여 이동하여, 새로운 프로젝트를 생성하여준다.

 

  프로젝트의 생성을 완료 하였으면, SMS 문자를 보낼 발신번호를 등록하여준다.

 

 2. API Url 및 요청 헤더에 필요한 정보 저장 

API Header

  API Url 및 Header에 담아야 할 정보는 위와 같다.

 

 

  header 정보의 x-ncp-iam-access-key를 위해 마이페이지-계정관리-인증키 관리로 이동하여서 위의 Access Key 및 Secret Key를 확인한다.

 

  API 접근을 위해 주소로 사용 할 수 있는 Service의 ID를 다음과 같이 확인하여준다.

 

 3. Node.js 파일 작성 

  a. userRoute.js

const user = require('./userController');

// 문자인증(SENS를 통한) 전송 API
app.post('/app/send', user.send);

// 문자인증(SENS를 통한) 검증 API
app.post('/app/verify', user.verify);

  

  b. userController.js

const secret_key = require("../../../config/secret_sms");

const axios = require('axios');
const Cache = require('memory-cache');
const CryptoJS = require('crypto-js');

const date = Date.now().toString();
const uri = secret_key.NCP_serviceID;
const secretKey = secret_key.NCP_secretKey;
const accessKey = secret_key.NCP_accessKey;
const method = 'POST';
const space = " ";
const newLine = "\n";
const url = `https://sens.apigw.ntruss.com/sms/v2/services/${uri}/messages`;
const url2 = `/sms/v2/services/${uri}/messages`;

const  hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secretKey);

hmac.update(method);
hmac.update(space);
hmac.update(url2);
hmac.update(newLine);
hmac.update(date);
hmac.update(newLine);
hmac.update(accessKey);

const hash = hmac.finalize();
const signature = hash.toString(CryptoJS.enc.Base64);

header의 x-ncp-apigw-signature-v2 속성을 위해, 다음과 같이 시그니쳐 생성을 위한 모듈 및 변수들을 선언하여준다. 이 때 설치되어 있지 않은 모듈들은 npm install [모듈이름]을 통해 설치 할 수 있다. 또한 이때의 secretKey 및 accessKey는 중요한 정보이므로, config 아래의 파일에 다음과 같이 입력하여주었다.

 

NCP_serviceID: 위에서 발급받은 Service의 ID

NCP_accessKey: 마이페이지-인증키 관리에서 얻은 Access Key ID

NCP_secretKey: Access Key ID 옆의 Secret Key

 

※send 함수 (인증문자 발송)

exports.send = async function (req, res) {
    const phoneNumber = req.body.phoneNumber;
  
    Cache.del(phoneNumber);
  
    //인증번호 생성
    const verifyCode = Math.floor(Math.random() * (999999 - 100000)) + 100000;
  
    Cache.put(phoneNumber, verifyCode.toString());
  
    axios({
      method: method,
      json: true,
      url: url,
      headers: {
        'Content-Type': 'application/json',
        'x-ncp-iam-access-key': accessKey,
        'x-ncp-apigw-timestamp': date,
        'x-ncp-apigw-signature-v2': signature,
      },
      data: {
        type: 'SMS',
        contentType: 'COMM',
        countryCode: '82',
        from: '발신번호 ex)01012341234',
        content: `[Milli] 인증번호 [${verifyCode}]를 입력해주세요.`,
        messages: [
          {
            to: `${phoneNumber}`,
          },
        ],
      }, 
      })
    .then(function (res) {
      res.send(response(baseResponse.SMS_SEND_SUCCESS));
    })
    .catch((err) => {
      if(err.res == undefined){
        res.send(response(baseResponse.SMS_SEND_SUCCESS));
      }
      else res.sned(errResponse(baseResponse.SMS_SEND_FAILURE));
    });
};

 

verify 함수 (인증문자 검증)

exports.verify = async function (req, res) {
    const phoneNumber = req.body.phoneNumber;
    const verifyCode = req.body.verifyCode;

    const CacheData = Cache.get(phoneNumber);

    if (!CacheData) {
      return res.send(errResponse(baseResponse.FAILURE_SMS_AUTHENTICATION));
    } else if (CacheData !== verifyCode) {
        return res.send(errResponse(baseResponse.FAILURE_SMS_AUTHENTICATION));
    } else {
      Cache.del(phoneNumber);
      return res.send(response(baseResponse.SMS_VERIFY_SUCCESS));     
    }
};

 

 

 4. POSTMAN 확인 

send 및 verify

다음과 같이 POSTMAN으로 전송하여 보면 성공적으로 이루어짐을 알 수 있다.

 

 

참고사이트

1. https://api.ncloud-docs.com/docs/ko/home

 

API 가이드 - HOME

 

api.ncloud-docs.com