Tools & Libraries/CoolSMS

[CoolSMS] SMS, 문자 전송 및 인증 기능 구현하기

대기업 가고 싶은 공돌이 2024. 8. 3. 03:48

문자 전송 API 서비스

https://coolsms.co.kr/

 

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

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

coolsms.co.kr

여러 가지 문자 전송 api가 존재한다.
그 중 coolsms는 첫 회원 가입시 200원을 무료로 충전해주고 Spring과 연동이 쉽다.
때문에 coolsms를 선택하게 되었다.

 

회원 가입

우선 coolsms에 회원 가입을 진행하고 다음과 같이 api key를 발급받아 주도록 하자.

 

Build.gradle

implementation 'net.nurigo:sdk:4.3.0'

 

coolSMS에서 제공하는 sdk 의존성을 주입한다.

 

application.yml

coolsms:
  apiKey: ${SMS_API_KEY}
  secretkey: ${SMS_SECRET_KEY}

 

이후 application.yml에 발급받은 apikey와 secretkey를 등록해준다.

 

SMS service

@Service
@RequiredArgsConstructor
public class SmsService {

    private final RedisUtil redisUtil;

    @Value("${SMS_API_KEY}")
    private String apiKey;

    @Value("${SMS_SECRET_KEY}")
    private String apiSecret;

    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", "01012345678");
        params.put("type", "SMS");
        params.put("app_version", "Fiurinee 1.0");
        params.put("to", to);
        params.put("text", "[Fiurinee] 인증번호"+ "[" + randomNum + "]를 입력해 주세요.");
        return params;
    }

    // 인증번호 전송하기
    @Transactional
    public void certificateSMS(String phoneNumber) {
        Message coolsms = new Message(apiKey, apiSecret);

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

        //인증 번호를 redis에 저장 만료시간은 5분
        redisUtil.set(phoneNumber, randomNum,5);

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

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

 

이후 coolsms의 예제를 보며 전송해야 할 파라미터의 형식을 알아낸 후 그와 같은 형식으로 파라미터를 설정해주었다.

 

    private HashMap<String, String> makeParams(String to, String randomNum) {
        HashMap<String, String> params = new HashMap<>();
        params.put("from", "01012345678");
        params.put("type", "SMS");
        params.put("app_version", "Fiurinee 1.0");
        params.put("to", to);
        params.put("text", "[Fiurinee] 인증번호"+ "[" + randomNum + "]를 입력해 주세요.");
        return params;
    }

 

  • from은 coolsms에 등록해둔 인증된 발신자 전화번호를 의미하며, 사업자 등록을 했다면 070과 같은 번호로도 문자를 전송할 수 있다.
  • type은 전송 타입을 의미하는데 coolsms에서 지원하는 전송 타입은 SMS이외에 카카오톡, 네이버 톡톡 등이 있다.
  • app_version은 coolsms에 등록해둔 어플리케이션의 버전을 입력해주면 된다.
  • to는 수신자 번호를 의미하며 수신자 번호는 api를 통해 프론트에서 입력 받을 것이다.
  • text는 말 그대로 문자 내용의 의미하며 최대 한글로 45자, 영어로 90자까지 가능하다.

 

랜덤으로 만든 인증 번호를 redis에 저장하여 5분간 저장해주었고
사용자가 입력한 인증번호와 일치하는지 redis에서 확인하여 사용자의 핸드폰 인증을 진행하였다.

 

API

@PostMapping("/send")
public void SendSms(@RequestBody SmsDto sms){
    smsService.certificateSMS(sms.getPhoneNumber().replace("-",""));
}

다음과 같이 사용자가 입력한 휴대폰 번호로 인증 번호로 전송해 주었다.

(coolsms에서 핸드폰 번호엔 '-'가 존재해선 안 된다.)

@PostMapping("/prove/{id}")
public ResponseEntity<?> certificateSms(@RequestBody CertificateDto dto, @PathVariable("id") Long id){
    String phoneNumber = dto.getPhoneNumber().replace("-", "");

    Object o = redisUtil.get(phoneNumber);

    if(o.toString().equals(dto.getCertificateNum())){
        memberService.updatePhoneNumber(id,phoneNumber);
        return ResponseEntity.status(200).build();
    }
    else{
        return ResponseEntity.status(400).build();
    }
}

 

다음과 같이 redis에 저장된 인증번호와 일치하는지 확인하여 일치한다면 200status를 반환해 주었다.

 

TEST

 

postman을 통해 테스트를 진행했으며, 다음과 같이 무사히 인증 번호를 받을 수 있었다.