본문 바로가기
Lecture/Spring

SMS서비스를 활용한 인증모듈 개발하기(Spring)

by 알 수 없는 사용자 2012. 7. 25.
반응형


<모 어플리케이션 인증 화면>


개발자이신데 아직도 인증모듈을 구매하십니까? 그렇다면 정답입니다.ㅋㅋㅋ 사실은 가져다 쓰는게 제일 속편하고 리스크도 크지 않을테지만 비용면과 sms인증모듈 설치에 대한 제약조건에 대하여 까다로움이 없지않아 있습니다.

그래서 이 강의에서는 개발자라면 sms서비스(완전 네트워킹 초 바닥 코딩...) 은 그냥 돈주고 사고 인증키 제네레이터를 구현하여 두개를 섞어서 sms 인증모듈을 개발하는것을 목표로 글을 써보겠습니다.


이 강의를 읽기전에...

■ 본 강의는 spring 3.0버젼의 mvc 모델을 베이스로 둔 강의입니다. 다시 말해 모델2입니다.

■ 본 강의는 회원가입 인증페이지 구현을 따로 보여주지 않습니다. jsp페이지는 개발자 여러분의 몫이며 저는 인증키 제네레이팅과 인증부분을 담당하는 클래스를 보여줄 뿐입니다.

■ 본 강의는 cafe24의 SMS호스팅 을 이용한 강의입니다. 다른 호스팅업체의 SMS호스팅을 이용할 경우에는 약간의 다른점이 있겠습니다.

■ 본 강의는 절대! never! cafe24를 홍보하려는 목적이 아닌 타 sms 서비스를 여러번 결제할경우 발생하는 금전적 비용으로 인한 문제로 어쩔수 없이 cafe24를 활용하는것임을 말씀드립니다.


그럼 강의 시작하겠습니다. 

인증모듈을 구성하려면 최소한 데이터베이스와 인증키를 제네레이팅 하여 데이터베이스에 삽입하는 서버가 필요합니다. 이 두가지는 회원가입을 받는 페이지라면 필수조건이라 어차피 있을꺼라 믿습니다.

인증모듈이 동작하는 원리는 전화번호를 입력받아 해당 번호를 어떠한 로직에 맞춰 가공후 숫자 or 숫자+영문 or 영문 의 키배열로 나열후 n~m자리까지를 잘라내어 데이터베이스에 저장합니다. 그리고 이 문자열을 입력한 전화번호로 sms전송하여 보여주고 이 인증번호를 다시 입력받아 데이터베이스에 누적된 값과 비교하여 일치하면 인증완료/ 불일치하면 인증 실패를 판가름하는것입니다.

■ 정리

1. 전화번호를 주고 인증키를 요청한다.

2. 서버는 전화번호를 갖고 인증키를 생성후 sms 전송을 시도한다.

3. 전송이 성공했을경우 데이터베이스에 해당전화번호를 갖고있는 레코드를 삭제후 다시 전화번호와 새로운 인증키로 레코드를 갱신한다

4. sms문자메시지로 인증키를 받는다.

5. 인증키를 입력하여 인증요청을시도한다.

6. 서버는 입력받은 인증키 전화번호를 갖고 데이터베이스에 조회하여 임시키와 인풋키를 비교하여 일치여부를 판가름하여 인증의 실패/성공을 따진다.

7. 이후 처리는 개발자들의 몫이다.




위 설명을 실행으로 옮겨보겠습니다.

일단은 cafe24의 sms 호스팅을 신청하는것입니다. 

http://www.cafe24.com/?controller=product_special&method=sms

위 주소는 cafe24의 sms호스팅제공 url입니다. sms서비스를 코딩하고픈분들은 직접하시면 통신사쪽으로 취직될수있으니 그렇게하십쇼. 허나.... 저는 못하므로 그냥 돈주고 사서 활용합니다. 

아무튼 서비스 결제를 하시고 아래 화면에서 user_id 와 secure 를 가져옵니다.



그리고 다음은 패키지에 인증키 생성과 SMS전송담당을하는 클래스를 추가해줍니다.

CertificationKeyGenerator.java

SMSFactory.java

두 클래스는 서로 맞물려있습니다. 다시말해 결합도가 살작 있는 클래스라 원하시면 따로 생성자와 SMS전송함수를 구현하여 섞어쓰시면됩니다. 


CertificationKeyGenerator

newInstance()

 -    인스턴스 생성. 인스턴스를 생성해야만 내부함수 이용


String tempKeyGenarator(String Number)

 -    전화번호(ex_ 010-0000-0000, '-' 포함)를 파라미터로 줄경우 숫자 6자리 인증키를 리턴함


void tempKeyGenerator(CertifiDAO certifiDAO ,String phone)

 -    인증키를 다루는 dao객체와 전화번호를 파라미터로 줄경우 인증키를 생성하고 해당 전화번호로 문자메시지를 보내며 데이터베이스에 이 인증키를 저장해둠.


boolean isCorrectCertifiKey( CertifiDAO certifiDAO , String phone , String inputKey)

 -    인증키가 맞는지 확인하는 함수로 해당 전화번호와 인증키, DAO를 파라미터로 넘겨 인증키 확인후 진위값을 리턴한다.


CertifiDAO클래스 내부에는 아래와 같은 함수들이 존재하면 되겠습니다.

public void insertCertificationKey(HashMap<Object, Object> param) {

// TODO Auto-generated method stub

getSqlMapClientTemplate().insert("insertCertificationKey", param);

}


public String getTempKey(String phone) {

// TODO Auto-generated method stub

return (String)getSqlMapClientTemplate().queryForObject("getTempKey", phone);

}


public void deleteTempKey(String phone) {

// TODO Auto-generated method stub

getSqlMapClientTemplate().delete("deleteTempKey", phone);

}


sqlmaps.xml 내부에는 아래와 같은 질의가 존재하면 되겠습니다.
<insert id="insertCertificationKey" parameterClass="HashMap">
INSERT INTO certification_tempkey (phone , tempkey)
VALUES (#phone#, #tempKey#)
</insert>
<select id="getTempKey" parameterClass="String" resultClass="String">
select tempKey
from certification_tempkey
where phone = #value#
</select>
<delete id="deleteTempKey" parameterClass="String">
delete
from certification_tempkey
where phone = #value#
</delete>

마지막으로 SMSFactory 클래스내부의 생성자에 인증키와 아이디를 위에서 얻어온 문자열로 대처해주시면 되겠습니다. 

String setMessage(String msg) 함수는 msg를 가공하는 함수이며 80바이트까지 문자열을 조합해서 리턴하면 리턴한 문자가 sms로 전송됩니다.


이상으로 인증모듈을 마치겠습니다. 알고보면 간단한 원리입니다.

궁금한사항은 댓글로 남겨주세요. 코드가 궁금하시다면 컨트롤러를 제공해드리겠습니다.


컨트롤러 요청으로 코드 공유드립니다.

@Override

public ModelAndView certificationKeyGeneration(String phone) throws Exception {

// TODO Auto-generated method stub

logger.debug("전화번호에 대한 인증키 생성을 시행합니다.");

logger.debug("전화번호 : "+phone);

ModelAndView mv = new ModelAndView();

try{

//인증키 삭제&생성 루틴 실행

CertificationKeyGenerator.newInstance().tempKeyGenerator(thamesMemberDAO, phone);

mv.addObject("result", "success");

}catch(Exception e){

mv.addObject("result", "fail");

}

mv.setViewName("thames/result/result");

return mv;

}

@Override

public ModelAndView certification(String phone , String inputKey) throws Exception {

// TODO Auto-generated method stub

logger.debug("sms인증을위해 디비와 값매칭을 시도합니다.");

logger.debug("inputKey : "+inputKey);

String result = "fail";

ModelAndView mv = new ModelAndView();

try{

if(CertificationKeyGenerator.newInstance().isCorrectCertifiKey(thamesMemberDAO, phone, inputKey)){

result = "success";

}else{

result = "fail";

}

}catch(Exception e){

result = "fail";

}

mv.addObject("result", result);

mv.setViewName("thames/result/result");

return mv;

}