안드로이드 스마트폰으로 무료 SMS 발송 서비스 구현

2025. 5. 1. 01:16· 프로젝트
목차
  1. 개요
  2. 주의점 — 한국 통신사 발송 제한
  3. 1. 세팅
  4. 2. 사용
  5. 2-1. cURL 예시
  6. 2-2. Webhook(수신)
  7. 3. API로 만들기
  8. 3-1. Django REST Framework
  9. 3-2. Spring Boot 3
  10. 4. 응용 — 3 분 제한 SMS 인증번호
  11. Redis 선택 이유
  12. 맺음말
반응형

안드로이드 휴대폰에 SMS Gateway for Android™ 앱을 설치하고 기기 IP (/message 엔드포인트)로 HTTP POST만 날리면, 별도의 유료 SMS API 없이 무료로 문자 알림·인증번호를 발송할 수 있습니다. 다만 SKT·KT·LG U+ 등 국내 통신사는 “문자 무제한” 요금제여도 하루 150 ~ 600 건(최대 600 건) 이상 발신 시 이용이 제한되므로 대량 발송 용도로는 적합하지 않습니다.

 

 

 

GitHub - capcom6/android-sms-gateway: The SMS Gateway for Android™ app enables sending and receiving SMS messages through an A

The SMS Gateway for Android™ app enables sending and receiving SMS messages through an API that can be accessed directly on the device or via a cloud server when direct device access is not possibl...

github.com

 


개요

  • SMS Gateway for Android™ 앱은 안드로이드 스마트폰을 SMS API 서버로 바꿔 줍니다
  • GitHub 프로젝트(capcom6/android-sms-gateway)에서 소스·CLI·Webhook 예제를 확인할 수 있습니다
  • 장점 : 100 % 무료, 셀룰러 망만 있으면 어디서나 작동
  • 단점 : 휴대폰 전원이 꺼지면 서비스도 중단, HTTP 기반(기본 HTTPS 미지원)

주의점 — 한국 통신사 발송 제한

통신사·요금제 예시 공식 약관 핵심 문구 1 일 제한치(요약)
SKT 정책 “일 사용량 200건 초과 월 10회 → 혜택 중단” 500 건
KT 정책 “휴대폰 부정가입 방지 → 일 500건 이상 발송 제한” 500 건
LG U+ 정책 “하루 150건 초과 10회 또는 500건 이상 즉시 제한” 150 ~ 500 건
알뜰폰(KT 망) “1 일 150건 초과 → 제한, 500건 초과 → 고객센터 문의” 150 ~ 500 건
종합 안내 “월 10 회 200건 초과 또는 1 일 500건 상한” 200 ~ 500 건

TIP : 스팸 신고 리스크
KISA 간편신고(118)로 신고되면 회선이 즉시 차단될 수 있으므로, 알림톡·카카오 비즈메시지 등 대체 채널을 병행하세요


1. 세팅

  1. 앱 설치

    https://sms-gate.app/ 에 방문하여
 

SMSGate - Private & Secure SMS Gateway for Android

Local Mode Maximum privacy with data stored only on your device. Perfect for users who want complete control over their data. All data stays on your device No external servers needed Complete data sovereignty

sms-gate.app

 

 

해당 버튼을 눌러 App 다운로드 

 

 

 

  1. Local Server On → 앱에 표시되는 IP:8080, id, pw 확인
  2. 포트포워딩 & DDNS(선택) → 외부 서버에서 호출하려면 8080 포트를 개방하거나 Nginx 리버스프록시로 HTTPS 종단암호화 권장
  3. 보안 → id/pw를 .env·Secrets Manager에 보관, 외부 IP ACL 로킹, Fail2Ban 탑재

2. 사용

2-1. cURL 예시

curl -X POST -u phone01:secret123 \
     -H "Content-Type: application/json" \
     -d '{
           "message": "인증번호는 5321 입니다.",
           "phoneNumbers": ["+821012345678"]
         }' \
     http://<휴대폰_IP>:8080/message
  • HTTP 202 응답이면 전송 성공

2-2. Webhook(수신)

  • 앱 설정 → Incoming SMS Webhook URL 입력 → 휴대폰이 수신한 모든 문자를 JSON POST로 전달 

3. API로 만들기

3-1. Django REST Framework

gateway_sms.py (Django 유틸)

import os, requests
GATEWAY = os.getenv("SMSGW_HOST")      # ex) http://192.168.0.22:8080
USER    = os.getenv("SMSGW_USER")      # phone01
PASS    = os.getenv("SMSGW_PASS")      # secret123

def send_sms(message: str, numbers: list[str]) -> None:
    """Android SMS Gateway로 단문 전송"""
    url = f"{GATEWAY}/message"
    resp = requests.post(
        url, auth=(USER, PASS),
        json={"message": message, "phoneNumbers": numbers},
        timeout=5
    )
    resp.raise_for_status()            # 2xx 아니면 예외

views.py (회원가입 → 3 분 인증번호 전송)

from rest_framework.views import APIView
from rest_framework.response import Response
from redis import Redis
from .gateway_sms import send_sms
import random

redis_cli = Redis(host="redis", decode_responses=True)

class SignupSMS(APIView):
    def post(self, request):
        phone = request.data["phone"]
        code  = f"{random.randint(1000, 9999)}"
        send_sms(f"인증번호 [{code}]를 3분 안에 입력해주세요.", [phone])
        redis_cli.setex(f"sms:{phone}", 180, code)   # TTL 3 분
        return Response({"detail": "sent"}, status=202)

3-2. Spring Boot 3

SmsGatewayClient.java (REST 호출 유틸)

@Component
public class SmsGatewayClient {
    @Value("${smsgw.host}") private String host;
    @Value("${smsgw.user}") private String user;
    @Value("${smsgw.pass}") private String pass;
    private final RestTemplate rest = new RestTemplateBuilder()
            .basicAuthentication(user, pass).build();

    public void sendSms(String text, List<String> numbers) {
        String url = host + "/message";
        Map<String,Object> body = Map.of(
            "message", text,
            "phoneNumbers", numbers
        );
        rest.postForEntity(url, body, Void.class);   // 2xx 아니면 예외
    }
}

AuthService.java (3 분 인증번호 발송·저장)

@Service
@RequiredArgsConstructor
public class AuthService {
    private final SmsGatewayClient sms;
    private final StringRedisTemplate redis;

    public void sendVerification(String phone) {
        String code = String.valueOf(
            ThreadLocalRandom.current().nextInt(1000, 10000));
        sms.sendSms("인증번호 [" + code + "]를 3분 안에 입력해주세요.",
                    List.of(phone));
        redis.opsForValue().set("sms:"+phone, code,
                                Duration.ofMinutes(3));
    }
}

4. 응용 — 3 분 제한 SMS 인증번호

graph LR
A[Client] -->|회원가입 요청| B(API Server)
B -->|인증번호 발송| C(SMS Gateway Phone)
C -->|SMS| D(User)
B -->|code=1234, TTL=180s| R[(Redis)]
D -->|코드 입력| B
B -->|검증 성공| E[(DB)]

Redis 선택 이유

  • 초단위 TTL 지원 → SETEX 한 줄로 “3 분 후 자동 삭제”
  • 메모리 기반 속도 → 높은 QPS에서도 지연 최소
  • 분산 Lock·Rate Limit → SETNX로 1 초 1 건 이상 발송 차단

대규모 트래픽이라면 Kafka 큐로 SMS Producer / Consumer를 분리하는 것도 고려하세요.


맺음말

소규모 개발·캡스톤·토이 프로젝트에서 휴대폰 + 오픈소스 앱만으로 무료 SMS 알림·인증번호를 구현할 수 있습니다. 다만 통신사 약관과 KISA 스팸 규정을 꼭 준수하고, 하루 발송량이 100 ~ 200 건을 넘어가면 정식 SMS API 또는 카카오 알림톡 같은 대체 채널을 병행하는 것을 권장드립니다.

반응형
저작자표시 비영리 (새창열림)
  1. 개요
  2. 주의점 — 한국 통신사 발송 제한
  3. 1. 세팅
  4. 2. 사용
  5. 2-1. cURL 예시
  6. 2-2. Webhook(수신)
  7. 3. API로 만들기
  8. 3-1. Django REST Framework
  9. 3-2. Spring Boot 3
  10. 4. 응용 — 3 분 제한 SMS 인증번호
  11. Redis 선택 이유
  12. 맺음말
'프로젝트' 카테고리의 다른 글
  • [Android]안드로이드 카카오 로그인 디버깅 키 해시 발급
  • [React - Supabase]생일 축하 카드 서비스
  • [React-SpringBoot]온라인 간편 결제(포트원) - 카카오페이, 토스페이 연동 및 API
Future0_
Future0_
rm -rf /
Future0_
Luna Developer Blog
Future0_
전체
오늘
어제
  • 분류 전체보기 (112)
    • 프로그래밍 (4)
      • 알고리즘 (4)
    • 보안 (14)
      • Dreamhack (4)
      • Hackthebox (1)
      • Webhacking (9)
    • 프로젝트 (4)
    • 공부 (80)
      • Database (2)
      • Python (11)
      • System (4)
      • Java (13)
      • JSP (13)
      • Spring (11)
      • Kotlin (16)
      • 자료구조 (10)
      • 기계학습 (0)
    • Docker (4)
    • Github (2)
    • Tip (1)
    • 잡담 (2)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • Java
  • Computer science
  • docker
  • 자료구조
  • spring
  • 1.9.22
  • dreamhack
  • Kotlin
  • 알고리즘
  • webhacking
  • 컴퓨터
  • 자바빈즈
  • jsp
  • cs
  • ViewModel
  • shared preference
  • native app
  • Python
  • 보안
  • api 통신
  • 상속
  • SpringBoot
  • React
  • 코틀린기본문법
  • Database
  • 키 해시
  • android studio 삭제
  • 디버깅키해시
  • 프로그래밍
  • Android Studio

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
Future0_
안드로이드 스마트폰으로 무료 SMS 발송 서비스 구현
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.