[Spring boot] 문자 SMS 인증 구현하기(1)
반응형

스프링으로 CoolSMS로 문자 SMS 인증 시스템을 구현해보았다. SMS 문자를 발송하는 부분이랑 발송한 랜덤인증번호를 Redis로 저장해두었다가 검증하는 과정으로 두 파트로 나누어 포스트를 정리해본다.

2021.12.22 - [Back-end/Spring & Spring Boot] - [Spring boot] 문자 SMS 인증 구현하기(1)

2021.12.22 - [Back-end/Spring & Spring Boot] - [Spring boot] 문자 SMS 인증 구현하기(2)

 

SMS API 서비스

문자 인증 API 서비스를 찾다가 제일 가격이 저렴하고 Spring과 무료 연동이 가능해 이 서비스를 선택하게 되었다.

https://coolsms.co.kr/

 

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

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

coolsms.co.kr

 

처음 가입 시 본인 인증 후 API 키를 발급 받게 된다.

이때 문제가 하나 있는데 대표 번호가 없다는 것이다. 개인 번호로 하기엔 조금.. 개인 정보의 문제도 있고 해서 번호를 하나 구매하였다.

아톡이 젤 저렴하고 월 2200원에 070으로 시작하는 번호를 얻을 수 있다.

 

대표 번호

http://atalk.co.kr/

 

아톡

070 인터넷 전화어플 아톡, 저렴한 국제전화는 물론 투넘버 및 안심번호 서비스를 제공합니다.

atalk.co.kr

아톡에 가입했다면 다시 coolSMS 가입 절차로 돌아가서 대표 번호로 070으로 발급한 번호를 등록해주면 된다. 다 등록했다면 SMS 서비스는 1건  당 20원이 청구되는데 처음에는 300포인트를 주기 때문에 15번 정도 무료로 이용 가능하다.

 

Spring에 연동

build.gradle에 SDK 추가

implementation 'net.nurigo:javaSDK:2.2'

 

application.properties에 API 정보 추가

coolsms.apikey = 개인APIKEY
coolsms.apisecret = 개인APISECRET
coolsms.fromnumber = 대표번호

coolSMS 사이트에 가서 내 정보를 확인하고 이것은 공개되면 안되는 부분이기에 properties에 설정해준 뒤 .gitignore에 설정해서 외부에 공개되지 않도록 한다.

 

.gitignore 설정

이렇게 추가해주면 git에 올릴 때는 properties파일이 안 올라가게 된다. -> 주의할 것!!

 

MessageService.java

이 부분은 coolSMS에서 가이드를 제공해서 쉽게 만들 수 있다. 내 코드는 다음과 같다. 랜덤한 숫자 4자리 인증번호를 생성해서 보냈다. @Value 어노테이션으로 properties에서 API 정보를 다 가져와서 사용했다.

public class MessageService {
    private final SmsCertification smsCertification;

    @Value("${coolsms.apikey}")
    private String apiKey;

    @Value("${coolsms.apisecret}")
    private String apiSecret;

    @Value("${coolsms.fromnumber}")
    private String fromNumber;

    private String createRandomNumber() {
        Random rand = new Random();
        String randomNum = "";
        for (int i = 0; i < 4; i++) {
            String random = Integer.toString(rand.nextInt(10));
            randomNum += random;
        }

        return randomNum;
    }

    private HashMap<String, String> makeParams(String to, String randomNum) {
        HashMap<String, String> params = new HashMap<>();
        params.put("from", fromNumber);
        params.put("type", "SMS");
        params.put("app_version", "test app 1.2");
        params.put("to", to);
        params.put("text", randomNum);
        return params;
    }

    // 인증번호 전송하기
    public String sendSMS(String phonNumber) {
        Message coolsms = new Message(apiKey, apiSecret);

        // 랜덤한 인증 번호 생성
        String randomNum = createRandomNumber();
        System.out.println(randomNum);

        // 발신 정보 설정
        HashMap<String, String> params = makeParams(phonNumber, randomNum);

        try {
            JSONObject obj = (JSONObject) coolsms.send(params);
            System.out.println(obj.toString());
        } catch (CoolsmsException e) {
            System.out.println(e.getMessage());
            System.out.println(e.getCode());
        }

        return "문자 전송이 완료되었습니다.";
    }

 

문자 SMS 전송까지 간단하게 다뤄보았고 발송한 인증번호 검증 파트는 다음 포스트로

2021.12.22 - [Back-end/Spring & Spring Boot] - [Spring boot] 문자 SMS 인증 구현하기(2)

반응형