목차

반응형

bizsiren 휴대폰 인증, IPIN 인증 모듈 사용시

PccIpinSecu 또는 PccHpSecu 함수에서 java.lang.StringIndexOutOfBoundsException 에러가 발생한다.



근데 아직도 모르겠는게 일단은 원인 해결해서 넘어갔는데 분명 저런문제가 없었는데 갑자기 어느날부터 저런 에러가 발생했다.



에러 메시지는 아래와 같다.

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

at java.lang.String.substring(String.java:1911) ~[?:1.7.0_151]

at CommonUtil.PccIpinSecu(Util.java:547) ~[classes/:?]


까보니까


retInfo  = sciSecuMg.getDec(retInfo, ReqNum);


int inf1 = retInfo.indexOf("/",0); <===== 요기에서 에러가 난다.

retInfo는 뭐하는놈이냐면 인증 모듈에서 서버측으로 전송하는 암호화된 인증 결과값이다.

getDec는 인증사에서 암호화되어 넘어온 retInfo를 유저 브라우저의 세션에서 저장되어 키값역할을 하는 ReqNum로 복호화를 해야하는데 (SciSecuManager 자바파일이 없어서 자세한건 모름)



서버쪽하고 클라이언트쪽에 얼러트와 sysout을 마구 심어서 살펴본 결과 문제를 찾았다.

세션에서 잘 유지되고 있어야하는 ReqNum이 null이어서 복호화하고나서(애초에 복호화하면 결과값이 ""임 복호화부터 실패한거지만 에러가 안날뿐임) 복호화된 정보를 split할때 인덱스 에러가 나는것이다.



근데 이게또 웃긴게 어떤컴퓨터는 세션에 남고 어떤 컴퓨터는 세션에 안남는게 문제다.

그래서 회사에 전화해봤다.

처음 전화했을때는 친절한 남자분이 받으셨는데 증상을 말씀드리고 서비스 등록정보 말씀드리고 우리꺼를 살펴보시다가

한번 인증 해보라고 하셔서 인증 해봤다.

"음 우리쪽에서는 문제가 없이 잘 처리가 되는 것 같은데요... 좀더 알아보고 연락드리겠습니다..."

예외상황을 처리한다는건 매우 귀찮고 삽질인것을 알기때문에 며칠기다리다가 다시 전화를 드렸다.

아마 연구원? 이신것같은데 어떤 까칠한 여성분께 상담을 받았다.

똑같이 증상을 말씀드렸다. 그러자 "음 근데 그 세션에 reqnum(키값)이 남는건 우리측 문제가 아닌것같음. 님쪽에서 처리해야함" 이러셨다.

흠 그래서 속으로 '조졌네' 이러고 끊으려는데 저쪽에서 reqnum을 랜덤으로 생성해서 세션유지하지말고 그냥 하드코딩해서 박아버리라는것이었다.

유레카 바로 그리했더니 처리됐다 ㅇㅇ 개똑똑하다.


기존 인증 모듈로 넘어가기전 클라이언트 측에서 랜덤 암호키를 생성하는 코드

String randomStrIpin = "";

for (int i = 0; i < numLengthIpin; i++) { //0 ~ 9 랜덤 숫자 생성 randomStrIpin += ranIpin.nextInt(10); } String reqNum = randomStrIpin;

위 라인을 그냥 요렇게 바꿔버리고

String reqNum = "jtowpjgrjgpjephprejohtpoej4towy43t";




서버측에서 세션에 저장된 랜덤으로 생성된 암호키를 불러오는 코드

//쿠키값 가져 오기
Cookie[] cookies = request.getCookies();
String tranjectionName = "";
String tranjectionReqNum = "";
/*if(cookies!=null){
for (int i = 0; i < cookies.length; i++){
Cookie c = cookies[i];
tranjectionName = c.getName();
tranjectionReqNum = c.getValue();
System.out.println("tranjectionName>>>>>"+tranjectionName);
System.out.println("tranjectionReqNum>>>>>"+tranjectionReqNum);
if(tranjectionName.compareTo("reqNumIpin")==0) break;

//tranjectionReqNum = "";
}
}*/
tranjectionReqNum = (String) session.getAttribute("reqNum");


에러나고나서 어떻게든 reqNum값 받아올려고 쿠키도 건들고 세션도 건들고 엄청 노력했음.

근데 그냥

String cookiereqNum = "jtowpjgrjgpjephprejohtpoej4towy43t"; 이러면 인증업체에 보낸 reqNum값과 서버측에서 복호화는 키값이 일치하여서 잘 작동함.

반응형