나의 이야기

스프링

회원가입시에 문자 인증 구현하기(coolSMS)

 

아래의 사이트에 들어가서 회원가입을 하여 api key를 생성한다.

 

링크 : https://coolsms.co.kr/

 

세상에서 가장 안정적이고 빠른 메시지 발송 플랫폼 - 쿨에스엠에스

손쉬운 결제 전용계좌, 신용카드, 계좌이체 등 국내 결제 뿐만 아니라 해용신용카드로 한번의 카드번호 등록으로 자동충전까지 지원합니다. 전용계좌, 신용카드, 계좌이체 등 다양한 결제 방식

coolsms.co.kr

 

 

- api키와 secret키를 노출되지 않도록 하여 잘 저장해두고 이후 사용한다

 

1. gradle 의존성 추가

implementation 'net.nurigo:sdk:4.3.0'

 

2. application.yml

coolsms:
  api:
    key: "your API Key"
    secret: "your API Secret"

 

3. SmsUtil

package com.example.keyboard.config.SMS;

import jakarta.annotation.PostConstruct;
import net.nurigo.sdk.NurigoApp;
import net.nurigo.sdk.message.model.Message;
import net.nurigo.sdk.message.request.SingleMessageSendingRequest;
import net.nurigo.sdk.message.response.SingleMessageSentResponse;
import net.nurigo.sdk.message.service.DefaultMessageService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class SmsUtil {

    @Value("${coolsms.api.key}")
    private String apiKey;
    @Value("${coolsms.api.secret}")
    private String apiSecretKey;

    private DefaultMessageService messageService;

    @PostConstruct
    private void init(){
        this.messageService = NurigoApp.INSTANCE.initialize(apiKey, apiSecretKey, "https://api.coolsms.co.kr");
    }

    // 단일 메시지 발송
    public void sendOne(String to, String verificationCode) {
        Message message = new Message();
        // 발신번호 및 수신번호는 반드시 01012345678 형태로 입력
        message.setFrom("01012345678");
        message.setTo(to);
        message.setText("[조선타자기] 회원가입 인증을 위한 아래의 인증번호를 입력해주세요\n" + verificationCode);

        SingleMessageSentResponse response = this.messageService.sendOne(new SingleMessageSendingRequest(message));
    }

}

 

4. Controller 구현

- 인증번호 보내는 send 기능, 인증번호 확인하는 verify 기능 구현

    @PostMapping("/send")
    public ResponseEntity<Object> sendVerifyNum(@RequestParam(value="phoneNum") String phoneNum){
        try {
            if(phoneNum.contains("-")){
                return new ResponseEntity<>("하이폰 제거 후 번호 다시 입력", HttpStatus.OK);
            }
            userService.sendVerifyNum(phoneNum);
            return new ResponseEntity<>("인증번호 발송 완료", HttpStatus.OK);
        }catch (Exception e){
            System.out.println(e.getMessage());
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }
    
    @GetMapping("/verify")
    public ResponseEntity<Object> checkVerifyNum(@RequestParam(value="phoneNum") String phoneNum, @RequestParam(value="verifyNum") String varifyNum){
        try {
            boolean check = userService.checkVerifyNum(phoneNum, varifyNum);
            return new ResponseEntity<>(check, HttpStatus.OK);
        }catch (Exception e){
            System.out.println(e.getMessage());
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }

 

5. Service 구현

- 랜덤 값을 구해 6자리 인증번호를 생성하고 그 인증 번호를 redis에 3분간 유효하게 하여 저장한다

- 이후 인증 확인을 할시에 redis의 번호와 입력받은 휴대폰 번호를 비교하여 로직 값을 return해 준다 

    public void sendVerifyNum(String phoneNum){
        Random random = new Random();
        // 6자리 랜덤 값 입력
        int verificationCode = random.nextInt(900000) + 100000;
        String verificationCodeStr = String.valueOf(verificationCode);

        // 인증번호 발신
        smsUtil.sendOne(phoneNum, verificationCodeStr);
        //인증코드 유효기간 3분 설정
        redisUtils.setData(phoneNum, verificationCodeStr, 60 * 3L);
    }

    public boolean checkVerifyNum(String phoneNum, String verifyNum){
        String certificationNum = redisUtils.getData(phoneNum);
        return certificationNum.equals(verifyNum);
    }

 

6. 테스트

- postman을 이용하여 CoolSMS의 API가 잘 작동하는지 확인

 

- verify를 요청하여 인증이 통과했을 시에 return값을 전송 받는다

 

완료 !