nice 본인인증 ... 로컬에서는 잘되던애가 막상 리눅스 톰캣 서버에 배포해보니 인증창 띄우는데 30초씩 걸리는 문제가 발생하였다.
이 글은 NiceID_1.1.jar 버전을 사용했다.
java 소스상에 단계별로 로그를 추가해서 확인해 보았다.
제공된 jar 에서 fnEncode(...) 라는 함수에서 블로킹이 발생했는데
개발지원에 문의해보았으나 시원한 해답을 얻을 수 없었다. 단지 함수가 외부 통신기능은 없다는 사실 정도는 확실히 알았다.
라이브러리를 디컴파일해서 살펴보았다. fnEncode() 안에 getLocalIPAddr() 함수를 호출하면서 지연이 발생하고 있었다.
getLocalIPAddr() 함수는 단순히 InetAddress.getLocalHost().getHostAddress() 값을 리턴하는 간단한 로직이었다.
InetAddress.getLocalHost().getHostAddress() 에 대해 찾아보니 delay 가 발생하는 사례가 있었다.
InetAddress.getLocalHost().getHostAddress() 함수가 DNS 조회를 하는데 이부분에서 hosts 파일에 제대로 등록이 안되어있으면 대기시간이 소요되던 것이다. 자세한 동작원리는 gpt 나 인터넷에 워낙 설명이 잘 나와 있어서 생략 하겠다.
/etc/hostname 에 설정한 값이 myhostname 이라면 이를
/etc/hosts 파일에
127.0.0.1 localhost myhostname
이렇게 추가해주면 InetAddress.getLocalHost().getHostAddress() 함수가 바로 IP 값을 반환할 수 있게 된다.
log1
fnEncode(...)
log2
다시 로그찍히는 시간을 확인해보니 함수 위아래 로그 시간 지연이 30초 였는데 완전히 사라졌다.