Go와 HTMX로 5분 만에 서류 없이 완벽한 SMS 본인인증 구현하기
2026-05-28T01:01:43.123Z
SMS 인증 붙이려고 API 찾아보니 서류가 필요하다고?
사이드 프로젝트나 스타트업 MVP를 개발하다 보면, 유저의 진짜 전화번호를 확인해야 할 때가 옵니다. 그런데 막상 국내 SMS API를 연동하려고 하면 숨이 턱 막힙니다. "사업자등록증을 제출하세요", "이용증명원을 내세요", "발신번호를 사전 등록하세요"... 이제 막 아이디어를 테스트하려는 1인 개발자나 토이 프로젝트 팀에게는 너무 가혹한 허들입니다.
게다가 최근 백엔드 개발자들 사이에서 대세로 떠오른 Go(Golang)와 HTMX 스택을 사용 중이라면, 무거운 자바스크립트 프레임워크 없이 빠르고 가볍게 인증 플로우를 구현하고 싶을 것입니다.
이 글에서는 **복잡한 서류 제출 없이 가입 후 5분 만에 즉시 사용할 수 있는 [EasyAuth(이지어스)]**를 활용해, Go와 HTMX 기반으로 자바스크립트 한 줄 없이 완벽한 SMS 인증(OTP)을 구현하는 방법을 알아봅니다.
Solution Overview: 이 글에서 배울 내용
- HTMX를 활용한 동적 폼(Form) 전환: JS 없이 인증번호 입력창 띄우기
- Go
net/http를 이용한 백엔드 구현: EasyAuth API (/send,/verify) 연동 - 서류 없이 5분 만에 연동하는 SMS API 팁
Step-by-Step Implementation
1. HTMX로 프론트엔드 UI 구성하기 (JS 제로)
HTMX를 사용하면 백엔드에서 HTML 조각을 렌더링해 바로 클라이언트의 DOM을 교체할 수 있습니다. 사용자가 전화번호를 입력하고 '인증번호 발송'을 누르면, 화면 새로고침 없이 해당 영역이 '인증번호 입력 폼'으로 부드럽게 전환되도록 만들어 보겠습니다.
Go + HTMX SMS Auth
<h2>휴대폰 본인인증</h2>
<div>
전화번호
인증번호 발송
</div>
2. Go 백엔드 구현하기 (EasyAuth 연동)
EasyAuth의 API 구조는 매우 직관적입니다. POST /send로 6자리 인증번호를 보내고, POST /verify로 맞는지 확인하면 끝입니다. Go의 기본 net/http 패키지만을 사용하여 구현해 봅시다.
// main.go
package main
import (
"bytes"
"encoding/json"
"fmt"
"html/template"
"io"
"net/http"
)
const EasyAuthAPI = "https://api.easyauth.kr" // EasyAuth 엔드포인트 가정
const APIKey = "YOUR_EASYAUTH_API_KEY" // 발급받은 API 키
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "index.html")
})
http.HandleFunc("/api/send", handleSend)
http.HandleFunc("/api/verify", handleVerify)
fmt.Println("Server starting on :8080")
http.ListenAndServe(":8080", nil)
}
func handleSend(w http.ResponseWriter, r *http.Request) {
phone := r.FormValue("phone")
// 1. EasyAuth API로 발송 요청
payload, _ := json.Marshal(map[string]string{"phone": phone})
req, _ := http.NewRequest("POST", EasyAuthAPI+"/send", bytes.NewBuffer(payload))
req.Header.Set("Authorization", "Bearer "+APIKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil || resp.StatusCode != http.StatusOK {
http.Error(w, "발송 실패", http.StatusInternalServerError)
return
}
// 2. HTMX를 위한 인증번호 입력 폼 반환 (HTML 조각)
html := `
인증번호 6자리
인증하기
`
fmt.Fprint(w, html)
}
func handleVerify(w http.ResponseWriter, r *http.Request) {
phone := r.FormValue("phone")
code := r.FormValue("code")
// 1. EasyAuth API로 검증 요청
payload, _ := json.Marshal(map[string]string{"phone": phone, "code": code})
req, _ := http.NewRequest("POST", EasyAuthAPI+"/verify", bytes.NewBuffer(payload))
req.Header.Set("Authorization", "Bearer "+APIKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
// 2. 결과에 따른 HTML 응답
if resp.StatusCode == http.StatusOK {
fmt.Fprint(w, `<div>✅ 인증이 완료되었습니다!</div>`)
} else {
fmt.Fprint(w, `<div>❌ 인증번호가 틀렸습니다. 다시 시도해주세요.</div>`)
}
}
Tips & Best Practices
- 보안 고려사항 (Rate Limiting): 악의적인 사용자가 SMS 발송 API를 무단 호출하는 것을 막기 위해 Go 서버 단에 Rate Limiter(예:
golang.org/x/time/rate)를 적용하세요. - HTMX 에러 핸들링: 백엔드에서 400이나 500 에러를 반환할 때 HTMX의
hx-on::response-error이벤트를 활용해 알림(Toast)을 띄워주면 UX가 훨씬 좋아집니다.
Conclusion: EasyAuth로 불필요한 시간을 아끼세요
위 코드를 보면 알 수 있듯, Go와 HTMX의 조합은 경이로울 정도로 훌륭합니다. 복잡한 상태 관리나 API 클라이언트 라이브러리 없이도 매끄러운 UX를 만들어냅니다.
하지만 이 모든 깔끔한 코드는 API 자체가 쓰기 쉬워야 빛을 발합니다. 사업자등록증 제출, 통신사 심사 대기, 발신번호 사전등록 등 복잡한 절차에 시달리지 마세요.
**개발자를 위한 초간단 SMS 인증 API, EasyAuth(이지어스)**를 사용하면:
- 서류 제출 전혀 없이 즉시 가입 및 이용
- 자동 발신번호 할당으로 사전등록 불필요
- 건당 15~25원의 합리적 가격 (신규 가입 시 10건 무료)
지금 바로 5분 만에 연동하고, 사이드 프로젝트의 핵심 비즈니스 로직에만 집중하세요!
Start advertising on Bitbake
Contact Us