API를 이용한 문자인증

지정욱·2024년 11월 24일
0

이번 글에서는 CoolSMS와 Redis를 이용하여 인증번호가 담긴 문자 메시지를 발송하고, 인증번호를 검증하는 방법에 대해 자세히 설명드리겠습니다. 사실 이 주제를 발표 주제로 생각한 것은 아니었지만, API와 관련된 부분을 더 깊이 알고 싶다는 마음에 선택하게 되었습니다. CoolSMS와 Redis를 사용하여 문자 인증 기능을 구현하는 과정에서 많은 것들을 배우게 되었습니다.

CoolSMS와 Redis 소개

이번 문자 인증 기능 구현에 사용할 주요 기술은 CoolSMS와 Redis입니다.

CoolSMS는 카카오 알림톡 및 문자 메시지 발송을 지원하는 REST API 서비스입니다. 이 API를 사용한 이유는 관련 자료가 많아 참고하기 쉽고, 기본적으로 15회 정도 무료로 문자 메시지를 보낼 수 있다는 점이 매우 유용했기 때문입니다.

Redis는 인메모리 기반의 Key-Value NoSQL 데이터베이스로, 데이터를 메모리에 저장하기 때문에 읽기와 쓰기 속도가 매우 빠릅니다. 인증번호와 같은 휘발성 데이터를 저장하기에 적합하며, 데이터의 TTL(Time To Live)을 설정하여 일정 시간 후에 자동으로 삭제할 수 있어 인증번호 관리에 매우 용이합니다.

인증번호는 특성상 오랜 시간 저장할 필요가 없기 때문에, 이러한 휘발성 데이터를 관리하기 위해 Redis를 사용하게 되었습니다. RDMS를 사용할 경우 비효율적이고 복잡한 과정이 필요할 수 있으나, Redis는 간단하고 빠르게 인증번호를 처리할 수 있습니다.

문자 인증 api

문자 인증 기능은 CoolSMS와 Redis를 이용해 구현됩니다. CoolSMS를 통해 인증번호가 담긴 문자 메시지를 발송하고, Redis를 사용하여 인증번호를 저장 및 검증하는 방식입니다.

문자 인증 API 개요

문자 인증 API의 주요 기능은 다음과 같습니다:
1. 인증번호 전송: 사용자가 입력한 전화번호로 인증번호를 전송합니다.
2. 인증번호 검증: 사용자가 입력한 인증번호가 Redis에 저장된 번호와 일치하는지 확인합니다.

AuthService 설명

AuthService 클래스는 CoolSMS와 Redis를 이용하여 문자 인증을 구현합니다. 주요 기능은 다음과 같습니다:

인증번호 생성 및 전송: sendAuthCode() 메서드는 4자리 랜덤 인증번호를 생성하고, 이를 CoolSMS를 통해 사용자의 전화번호로 전송합니다. 이후 Redis에 이 인증번호를 저장하며, 유효기간은 5분으로 설정됩니다. 이는 인증번호가 일정 시간 이후 자동으로 만료되도록 하는데, Redis의 TTL 기능을 활용한 것입니다.

인증번호 검증: validateAuthCode() 메서드는 Redis에 저장된 인증번호와 사용자가 입력한 인증번호를 비교하여 인증 여부를 확인합니다.

@Service
@RequiredArgsConstructor
public class AuthService {

    private final CoolSmsService coolSmsService; // SMS 전송 서비스
    private final RedisTemplate<String, String> redisTemplate; // Redis 템플릿

    public String sendAuthCode(String phoneNumber) throws Exception {
        String authCode = generateRandomNumber(); // 랜덤 인증코드 생성
        String message = "인증번호는 [" + authCode + "] 입니다."; // SMS 내용

        // SMS 전송
        coolSmsService.sendSms(phoneNumber, message);

        // Redis에 인증번호 저장 (유효 기간 5분)
        redisTemplate.opsForValue().set(phoneNumber, authCode, 5, TimeUnit.MINUTES);

        return authCode; // 인증 코드 반환
    }

    public boolean validateAuthCode(String phoneNumber, String authCode) {
		    // redis에서 저장된 인증코드 조회
        String storedCode = redisTemplate.opsForValue().get(phoneNumber); // redis의 데이터 조회
        // 저장된 코드와 입력된 코드 비교
        return storedCode != null && storedCode.equals(authCode);
    }

    private String generateRandomNumber() {
        Random rand = new Random();
        StringBuilder numStr = new StringBuilder();
        for (int i = 0; i < 4; i++) { // 4자리 인증번호
            numStr.append(rand.nextInt(10));
        }
        return numStr.toString(); // 생성된 인증번호 문자열로 반환
    }
}


인증번호 전송 화면: 사용자가 전화번호를 입력하고 인증번호를 요청하면, 해당 번호로 인증번호가 전송됩니다.
인증번호 전송 화면: 사용자가 전화번호를 입력하고 인증번호를 요청하면, 해당 번호로 인증번호가 전송됩니다.

정리

CoolSMS와 Redis를 이용하여 문자 인증 기능을 구현하는 과정을 살펴보았습니다. CoolSMS를 통해 쉽게 문자 메시지를 발송하고, Redis의 인메모리 데이터베이스를 활용하여 빠르게 인증번호를 관리함으로써 효율적인 문자 인증 시스템을 구축할 수 있었습니다.

Redis의 인메모리 특성과 TTL 기능은 인증번호와 같은 휘발성 데이터를 관리하는 데 매우 유용하며, 이를 통해 인증번호의 생성, 전송, 검증을 효과적으로 처리할 수 있었습니다. 이번 과정을 통해 REST API 기반의 문자 인증 기능을 손쉽게 구축하는 방법을 배울 수 있었으며, 실무에서도 쉽게 응용할 수 있는 내용이었습니다

profile
T자형 개발자가 되자

0개의 댓글