IT정보공유/C#

네이버 센스 SMS API 헤더 생성에 필요한 HmacSHA256과 UTC Timestamp

알지오™ 2020. 12. 1.

네이버에서는 기업을 대상으로 클라우드 서비스를 하고 있습니다.

클라우드 서비스 중에서도 Simple & Easy Notification Service 라고 해서

간단하고 쉬운 알림 서비스를 지원하고 있는데요.

쉽게 설명하면, 모바일 PUSH 서비스나 SMS, MMS, LMS 등과 같은  문자메세지 기반 서비스를 제공하고 있습니다.

 

그중에서 SMS 문자메세지나 MMS 같은 멀티미디어 문자메세지 기능을 제공하는 서비스가 SENS (센스)입니다.

 

Simple & Easy Notification Service - Naver SENSE API

 

SENSE는 메세지서버 구축 없이 메세지 알람 기능을 구현할 수 있는 서비스에요. 네이버가 다 알아서 해주니까요.

개발자는 문자메세지 발송과 관련된 API만 사용하면 됩니다.

참 쉽죠잉?

 

 

SMS API - API 참조서

기본 정보 API URL https://sens.apigw.ntruss.com/sms/v2 항목 Mandatory 설명 Content-Type Mandatory 요청 Body Content Type을 application/json으로 지정 (POST) x-ncp-apigw-timestamp Mandatory 1970년 1월 1일 00:00:00 협정 세계시(UTC)부

apidocs.ncloud.com

 

그런데 이 API 참조문서를 보다보면 API Header를 만드는 부분에 대한 설명이 나오는데

요즘 대세가 웹서비스 기반이다 보니 C# 샘플코드는 없습니다.

그리고 조금은 설명이 부족하다 싶어서 SMS 발송 기능 개발 테스트를 하면서 막히는 부분이 생기더라고요.

 

 

다른 부분은 크게 문제가 없이 이해가 됐는데, 

 x-ncp-apigw-timestamp
 x-ncp-apigw-signature-v2

이 두개의 헤더 파라미터가 문제가 되서 SMS 발송이 되질 않더라고요.

 

"원격 서버에서 (401) 권한이 없음 오류를 반환했습니다."

 

그래서 저와 같이 타임스탬프 문제나 HmacSHA256 관련문제로 해메시는 분이 계실까봐

c# 샘플 코드를 올려봅니다.

 

x-ncp-apigw-timestamp

 

타임스탬프 부분은 아래와 UnixTimeNow()함수로 리턴받은 값을 스트링 문자열로 변환해서 값을 대입해주면 됩니다.

//
        static public long UnixTimeNow()
        {            
            return (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds * 1000);
        }
//        

 

UTC 협정 세계시 기준부터 경과한 시간을 밀리세컨드로 변환하는 것입니다.

 

x-ncp-apigw-signature-v2

시그니쳐부분은 HmacSHA256 으로 암호화해서 사용해야 하며, 암호화 이후, BASE64로 다시 인코딩 한

문자열을 대입하면 됩니다.

//
        static public string generateHMAC(string msg, string key)
        {
            string result = null;

            HMACSHA256 hmac = new HMACSHA256(System.Text.UTF8Encoding.UTF8.GetBytes(key));
            byte[] hashValue = hmac.ComputeHash(System.Text.UTF8Encoding.UTF8.GetBytes(msg));

            result = Convert.ToBase64String(hashValue);                        

            return result;
        }
//        

 

UTF8문자열로 Hmacsha256 암호화 해쉬를 만들고, 만들어진 해쉬를 다시 Base64문자열로 변환하는 코드입니다.

 

기타 다른 부분은 센스API 설명서를 참고하시고, 제 포스팅에서는 헤더부분만 참고하시기 바랍니다.

API Body부분은 일반적인 json 이라 어렵지 않으실겁니다.

댓글

💲 추천 글