네이버 클라우드를 이용한 카카오 알림톡 전송하기

2025. 3. 18. 10:59·개발/클라우드
안녕하세요 제하쓰의 제이입니다.
오늘은 네이버 클라우드를 사용해서 유저에게 카카오톡 알림톡을 전송하는 내용을 공유드리려고 합니다.

카카오 알림톡 정의

저희 회사에서 서비스중인 프로젝트의 경우 회원가입시 별도의 문자 인증이 필요합니다. 국내에서는 주로 PASS앱을 활용한 인증 서비스를 구현하는데 이게 비용이 만만치가 않습니다.. 특히 저희 같은 작은 회사는 한푼한푼이 아쉽거든요.

twilio

원래 서비스 중이던 앱은 글로벌 마켓을 타겟으로 해서 전세계에 문자 메시지를 보낼 수 있는 twilio 라는 문자 전송 API 플랫폼을 사용하고 있었습니다. 하지만 국내만 타겟팅해서 서비스하는걸로 계획이 변경되었습니다.

다만 twilio는 몇가지 문제가 있는데요, 기본적으로 해외 서비스다 보니 문자가 해외에서 옵니다(중요). 유저가 해외문자차단서비스나 스팸방지 설정등에 따라서 인증 번호를 못받는 경우가 생길 수도 있습니다.

Verified Caller IDs

그리고 twilio는 test 용도로 문자를 보내는게 까다롭습니다. 무료버전에서는 기본적으로 Verified Caller IDs 라는 곳에 등록된 번호만 테스트가 가능한데요, 이게 참 골때립니다. 나라 선택에 한국이 있는데 번호를 입력해도 인증 문자가 오지 않습니다. 한참을 기다려도 안와서 고객센터에 문의해보니..

대충 전화번호 등록이 안된다는 말

답변으로

수동으로 보내주겠다!

이 친구들이 한국은 인증이 안되서 고객센터에 번호를 남겨주면 수동으로 문자를 보내주겠다 하더라고요. 근데 이게 또 골때리는게 

티키타카

이런식으로 두번을 보내줘야하는데 시차 때문에 꼬박 하루가 넘게 걸리실 수도 있어요..

저는 더 이상 홧병나기 싫어서 네이버 클라우드와 카카오 알림톡 조합을 사용하기로 결정하였습니다.

준비물은 네이버 클라우드 계정과 카카오톡 채널입니다!

프로젝트 생성

Simple & Easy Notification Service로 이동하셔서 프로젝트를 생성해주세요. 저는 이미 만든 프로젝트가 있어서 저렇게 뜹니다.

채널 등록

이제 알림톡을 보낼 채널을 등록해주세요. 채널 ID는 채널의 이름입니다. EX) @채널이름

채널 등록이 완료되었다면 이제 알림톡 템플릿을 생성할 수 있는데요? 템플릿 코드는 API를 호출할때 지정할 코드입니다. 밑에서 코드를 보여드릴건데 바로 이해가 가실거에요. 저는 인증번호를 보내는 내용이라 본문 내용을 저런식으로 쓰는데 변수를 쓰실때는 #{변수명} 이런식으로 써야 치환이 됩니다.

템플릿을 등록하시면 바로 쓸 수 있는게 아니고 검수 기간이 존재합니다. 저희는 그동안 해당 알림톡을 전송요청하는 코드를 작성해보겠습니다.


저희 회사는 현재 프로젝트에서 FastAPI로 API서버를 구축하여 운영하고 있습니다. 이제부터 코드단에서 인증번호 알림톡을 전송하는 API를 구현해보겠습니다.

@router.post("/send-sms-auth", status_code=status.HTTP_200_OK)
async def send_auth_sms(
    sms: schemas.SendSmsAuth,
    db: Session = Depends(get_db),
):
    try:
        await service.check_phone_number(sms.phone, db)
        send_sms = await service.send_sms_auth(sms.phone, db)
        db.commit()
        return send_sms
    except HTTPException as e:
        print(e)
        db.rollback()
        raise e
    except Exception as e:
        print(e)
        db.rollback()
        raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Failed to send SMS")

클라이언트에서 인증 번호 전송을 요청하는 라우터 코드입니다. 클라이언트 단에서 전화번호를 보내주면 정규식으로 전화번호 검증후 알림톡을 보내게 됩니다.

async def send_sms_auth(phone: str, db: Session):
    random_num = str(secrets.randbelow(1000000)).zfill(6)
    sms = {
        "template": "smscode",
        "phone": phone,
        "msg": f"인증번호는 [{random_num}]입니다.",
    }
    sms_sens = await send_alimtalk_ncloud(sms)
    if sms_sens:
        await addnox_crud.set_sms_random_number(db=db, phone_number=phone, validation_code=random_num)
    return True

인증번호를 위해 난수를 이용해 랜덤 번호를 생성합니다. 여기서 template는 알림톡 템플릿을 등록할때 작성했던 템플릿 코드입니다. msg는 본문 내용으로 알림톡 템플릿을 등록할때 작성했던 내용이랑 정확히 일치해야합니다. 하나라도 틀리면 알림톡이 전송되지않습니다.

# 알림톡 전송 함수
async def send_alimtalk_ncloud(sms: dict):
    try:
        # 현재 타임스탬프 생성
        timestamp = str(int(time.time() * 1000))

        # 요청 URL
        url = f"https://sens.apigw.ntruss.com/alimtalk/v2/services/{service_id}/messages"

        # 요청 데이터
        payload = {
            "plusFriendId": "@테스트",  # 플러스친구 ID
            "templateCode": sms["template"],  # 승인된 템플릿 코드
            "messages": [
                {
                    "to": sms["phone"].lstrip("+"),  # 수신자 전화번호
                    "content": sms["msg"],  # 메시지 내용
                }
            ],
        }

        # 요청 헤더
        headers = {
            "Content-Type": "application/json; charset=utf-8",
            "x-ncp-apigw-timestamp": timestamp,
            "x-ncp-iam-access-key": ncloud_accesskey,
            "x-ncp-apigw-signature-v2": make_signature(timestamp),
        }

        # POST 요청 보내기
        response = requests.post(url, json=payload, headers=headers)

        # 응답 상태 확인
        if response.status_code == 202:  # 요청이 성공적으로 처리된 경우
            return True
        else:
            print(f"Error Response: {response.json()}")
            raise HTTPException(status_code=409, detail="Alimtalk send failed")
    except Exception as e:
        print(f"Exception: {e}")
        raise HTTPException(status_code=500, detail="Internal Server Error")


def make_signature(timestamp):
    secret_key = bytes(ncloud_secretkey, "UTF-8")
    method = "POST"
    uri = f"/alimtalk/v2/services/{service_id}/messages"
    message = f"{method} {uri}\n{timestamp}\n{ncloud_accesskey}"
    message = bytes(message, "UTF-8")
    signing_key = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
    return signing_key.decode("UTF-8")

먼저 API를 호출하기전에 Header를 구성해야하는데 signature를 생성하는 부분이 살짝 까다롭습니다. 저는 위에 방식으로 구현하였으니 참고 바랍니다. API 인증키 생성 가이드

네이버의 알림톡 API는 문서화가 잘되어 있습니다. 아래 링크를 통해 참고하시면 될 것 같습니다.

https://api.ncloud-docs.com/docs/ai-application-service-sens-alimtalkv2

 

알림톡 API

 

api.ncloud-docs.com

 

'개발 > 클라우드' 카테고리의 다른 글

AWS Certified Developer - Associate 합격 후기 및 꿀팁  (0) 2025.04.13
AWS ECS에서 CodePipeline을 활용한 CI/CD 구축 방법  (0) 2025.03.14
'개발/클라우드' 카테고리의 다른 글
  • AWS Certified Developer - Associate 합격 후기 및 꿀팁
  • AWS ECS에서 CodePipeline을 활용한 CI/CD 구축 방법
제하쓰
제하쓰
JeHa InfoBox: 맛집·카페 탐방, 개발 지식, 생활 꿀팁을 전하는 블로그입니다.
  • 제하쓰
    JeHa InfoBox
    제하쓰
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 카테고리
    • 전체 글 (108) N
      • 개발 (6)
        • 백엔드 (3)
        • 클라우드 (3)
      • 디자인 (10)
        • 캘리그라피 글귀 모음 (6)
      • 음식탐방 (20) N
      • 여행 (24)
      • 생활 꿀팁 (27)
      • 스포츠 (8)
  • 최근 글

  • 최근 댓글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
제하쓰
네이버 클라우드를 이용한 카카오 알림톡 전송하기
상단으로

티스토리툴바