2. 컴퓨터 이야기/프로그래밍

대량 이메일 발송 Frame

래빗 크리스 2008. 12. 19. 13:57
2009/01/05 - [2. MyJob/Language] - 팝업 return 값 이용, window.showModalDialog, window.returnValue

개인정보에 대한 누출이 이루어지지 않도록 이메일을 대량으로 발송해야 하는 경우 어떻게 해야 할까.
여러 신용카드사들의 경우, 이메일 원문에는 일반적인 소식지만 넣고 보안성 처리가 된 개인정보는 첨부파일에 들어 있다.

이곳에서는, 이메일 원문에 일반 내용을 넣고 첨부 파일 없이 웹서버 SSL 을 타고 개인정보를 보여주는 방법을 설명한다.
개인정보가 들어가는 부분은 팝업 기능을 통해서 구현하겠다.
SSL(Secured Socket Layer) 을 사용하려면 웹서버에 인증서가 설치되어 있어야 한다.
일명 보안서버라고 하는데, 이곳에서는 SSL 서버 설치에 대해서는 설명하지 않는다.

요즈음은 보안성 때문에 이메일 원문에 스크립트가 있으면 작동하지 못하도록 별도의 태그로 전환하는 웹메일 사이트가 많다.
따라서 첨부 파일이 아니면서 SSL 을 통한 개인정보 노출을 하려면 이메일 원문에 iFrame 을 사용하여 구현해야 한다.
먼저 일반적인 내용의 파일을 email.html 이라 하고 웹서버쪽 SSL 호출을 emailSSL.jsp 라 하자.

email.html 안에는 다음과 같은 부분이 포함되어야 한다.
www.abcdefg.com 은 설명을 하기 위한 것이지 실제 사이트가 있는 것은 아니다.

email.html 내용물 (대량으로 발송되는 이메일 본문)

...
<iframe name="iframeA" srchttps://www.abcdefg.com/SSL/emailSSL.jsp?paramA=valueA&paramB=valueB&paramC=valueC&paramD=valueD" frameBorder="0" border="0" width="670" height="295" allowTransparency="true"></iframe>
...

iFrame 의 테두리를 0 로 하고, width 나 height 는 필요에 맞게 처리하면 된다.
allowTransparency="true" 부분은 iFrame 내용 부분을 투명하게 처리한 부분인데, 필요하지 않다면 넣지 않아도 된다.
위와 같이 했다면 이메일 원문 email.html 안에 일반적인 내용만 담겨졌을 테고,
개인정보가 들어간 부분은 https://www.abcdefg.com/SSL/emailSSL.jsp 가 처리하면 된다.
paramA, paramB, .. 등등의 파라미터에는 발송된 이메일과 관련된 정보가 들어 있으면 된다.
나머지 부분은 상황에 맞게 설정하면 되겠다.
개인정보 보호를 위해서는 인터넷 회원 아이디 보다는 이메일 발송번호를 활용하는 것이 낫다.

emailSSL.jsp 에는 신용카드사들이 이용하는 방법처럼 주민번호 뒷자리 7자리 숫자를 입력받도록 화면을 구성하자.
이메일을 받은 사람이 주민번호 뒷자리 7자리 숫자를 입력하고 확인을 해 주면,
emailSSL.jsp 를 다시 호출하고 DB 를 조회하여 관련정보가 맞는지 체크하고..
이메일을 발송하려는 본래 목적인 개인정보 페이지를 모달(Modal) 팝업으로 표시하자.

IE(MS Internet Explorer) 7.0 부터는 해당 페이지의 URL 을 상단에 표시해주는 창이 있다.
URL 을 입력하는 주소창과는 다른 창으로 수정이나 입력이 불가하고 보여주기만 가능하다.
window.showModalDialog 를 사용하면 상단에 표시되는 URL 창이 나오지 않기 때문에 보안성도 높아진다.
더우기 마우스 오른쪽 버튼을 이용한 소스보기도 차단이 가능하다.
모달로 팝업을 띄우면, window.focus() 가 옮겨져서 팝업이 어디론가 사라지는 현상도 없어져서 좋다.

showMoalDialog 의 경우 파라미터를 오브젝트에 담아서 전달하는 것이 가능한데,
전달받은 파라미터는 스크립트에서 사용할 수 있기 때문에 아래와 같은 해당 규칙을 따라야 한다.
아니면 emailModal.jsp?paramA=valueA... 와 같이 넣어야 하는데 이러면 post 방식이 아니고 get 방식이라서.. 비추다.
emailSSL.jsp 에는 다음과 같은 내용이 들어가야 한다. 실제 모달로 띄워지는 창은 emailMoal.jsp 라고 하자.

emailSSL.jsp 내용물 (이메일 원문에 설치한 iFrame 에서 호출하는 SSL 처리 페이지)

...
var obj = new Object();
obj.paramA= '<%= request.getParameter("paramA") %>';
obj.paramB= '<%= request.getParameter("paramB") %>';
obj.paramC= '<%= request.getParameter("paramC") %>';
obj.paramD= '<%= request.getParameter("paramD") %>';
window.showModalDialog('/SSL/emailMoal.jsp',obj,'dialogWidth=791px; dialogHeight=1024px');
...


emailModal.jsp 에서는 다음과 같이 처리한다.
modal 에서 <a> 태그를 달면 모달 팝업 안에서 돌지 않고 새창으로 뜨기 때문에,
보여지는 화면이 1개 뿐이면 iFrame 을 사용할 필요가 없지만
버튼이나 탭 이미지를 클릭할 때마다 모달 팝업 안에서 화면이 전환되어야 한다면 iFrame 을 사용한다.
실제로 개인정보를 담고 있는 파일을 memberInfo.jsp 라고 하자.
모달 팝업이 띄워지면 전달받은 파라미터를 팝업창에 전달한다.

emailMoal.jsp 내용물 (모달로 띄워진 팝업 페이지)
...
<form name="formA" method="post">
<input type="hidden" name="paramA" value="">
<input type="hidden" name="paramB" value="">
<input type="hidden" name="paramC" value="">
<input type="hidden" name="paramD" value="">
...
</form>

<iframe name="iframeA" src="" style="width:100%; height:100%"></iframe>

<script>
<!--
var  f      = document.forms['formA'];
f.action     = '/SSL/memberInfo.jsp';
f.paramA.value = dialogArguments.paramA;
f.paramB.value = dialogArguments.paramB;
f.paramC.value = dialogArguments.paramC;
f.paramD.value = dialogArguments.paramD;
f.target     = iframeA;
f.submit();
//-->
</script>
...


이상으로 대량발송되는 이메일에 보안성을 부여하는 방법을 구현해 보았다.
물론, 다른 방법들도 많이 있겠지만 위에서는 다음과 같은 기술들을 사용했다.
iFrame, showModalDialog