namecheck-1.0.jar의 파일명을 가지고있는 파일로
실명인증 모듈을 붙일때
로컬 windows7 pc에서는 잘 동작했는데
서버인 centos 에서는
namecheck.getRtn()의 리턴값이 9만 되돌아 오는 경우였다.
9는 전송된 데이터(주민번호,이름,사이트패스워드,사이트아이디)가 빠지거나 이상하게 전송된 경우이다.
namecheck jar 파일을 decompile해보면
단순히 post 데이터를 서버로 전송하는 수준의 코드만 들어있다.
POST /cnm.asp HTTP/1.1
Accept: */*
Connection: close
Host: wtname.creditbank.co.kr
Content-Type: application/x-www-form-urlencoded
Content-Length: 70
a3=
&a2=
&a1=
파라메터의 정보는 삭제했다.
a3는 실명, a2는 주민번호와 현재 시스템 시간을 가지고 생성된값, a1은 사이트 아이디로 이뤄져있다.
어쨋든 문제가 한글이라고 파악할 수 있었던 점은
로컬에서는 주민번호는 제대로 된 데이터를 입력하고 이름을 엉망으로 입력하면
2번 에러코드가 떨어졌다.
그런데 서버에서는 이름이 2자일땐 2번에러가 1자리일땐 9번에러가 떨어졌다.
이건 뭐 확정범이 아닌가?
인코딩은 여러곳에서 체크를 해줘야한다.
jsp에서는
<%@page contentType="text/html; charset=UTF-8" %>
다음과 같이 컨텐츠 타입을 지정해준다.
실명인증을 하려고 데이터를 보낼땐 euc-kr로만 데이터를 받는다.하지만 모듈 내부에서 euc-kr로 변환 해주는 코드는 없기 때문에 추가 작업이 필요하다.
다음과 같이 시스템 프로퍼티를 수정해주고
java.util.Properties pros = System.getProperties();
pros.setProperty("file.encoding", "euc-kr");
System.setProperties(pros);
다음과 같이 인코딩을 서버에서 한번 확인해준다.
String charset[] = {"KSC5601","8859_1","UTF-8","EUC-KR","MS949"};for(int i=0; i for(int j=0;j String data = new String(request.getParameter("e_masternm").getBytes(charset[i]),charset[j]);System.out.println(charset[i]+":"+charset[j]+":"+data+"("+URLEncoder.encode(data,"EUC-KR")+")");}}
만약에 실명을 '황인석'이라고 입력했을 땐
%C8%B2%C0%CE%BC%AE라는 데이터가 실명인증서버로 전송되어야
정상적인 인증이 가능하다. 만약 실명인증이 잘안된다면 저 문자열로 저 인코딩 데이터가 나오는지 테스트 해보면 된다.
euc-kr 코드표 테이블은 여기에 있다.
그리고 namecheck.jar파일을 수정해야한다.
stringbuffer.append(URLEncoder.encode("a3") + "=" + URLEncoder.encode(ChkName) + "&");
위와 같은 내용이 있을텐데 encode(String)메소드는 deprecated 된 메소드인데 왜 쓴지 모르겠다.
deprecated라는 어노테이션이 붙었다는건 이메소드는 추후에 삭제될 메소드이니 왠만하면 쓰지 마시오 라는 뜻이다.
코멘트 내용이다.
@deprecated The resulting string may vary depending on the platform's* default encoding. Instead, use the encode(String,String)* method to specify the encoding.
그래서 파라메터 두개짜리 encode로 수정을 해줘야한다. 하단처럼..
stringbuffer.append(URLEncoder.encode("a3") + "=" + URLEncoder.encode(ChkName,"EUC-KR") + "&");
jar파일을 decompile해서 수정해서 프로젝트에 추가하고 쓰는게 편할 것 같다.
댓글