안드로이드 휴대폰에 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. 세팅
- 앱 설치
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 다운로드
- Local Server On → 앱에 표시되는
IP:8080
,id
,pw
확인 - 포트포워딩 & DDNS(선택) → 외부 서버에서 호출하려면 8080 포트를 개방하거나 Nginx 리버스프록시로 HTTPS 종단암호화 권장
- 보안 →
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 또는 카카오 알림톡 같은 대체 채널을 병행하는 것을 권장드립니다.