Java VM 의 DNS caching TTL


Java VM 은 DNS lookup 시 TTL(time-to-live) 전략을 쓰지 않고 한 번 lookup한 도메인 이름은 VM 이 내려갈때까지 계속 캐싱을 하고 있다. (DNS Spoofing 공격을 막기 위함이라고 한다..)


이때문에 외부에 있는 서버의 IP 가 변경되는 경우(예로 google의 reChPTCHA는 가끔 IP 를 변경한다고 한다.) 예전 IP 로 접속하는 문제가 발생할 수 있다.


이 문제를 해결하려면 Java VM 을 완전히 내렸다가 올려야 하며 WAS를 사용할 경우 WAS 를 재구동해야 한다.


또 다른 해결책은 TTL 을 사용하도록 Java SecurityManager의 policy를 수정한 후에 JVM 을 구동하는 방법이 있다.

수정 대상 policy

networkaddress.cache.ttl

성공한 dns lookup 에 대해 cache 여부.

value의미비고
-1cache foreverdefault
0cache 하지 않음매번 DNS Server 에서 lookup
0 보다 큰 정수TTL 시간60으로 설정시 60초가 지났을 경우 다시 DNS Server를 통해 lookup


networkaddress.cache.negative.ttl

실패한 DNS lookup 에 대해 cache 할지 여부이며 기본 설정은 10 이다.

value의미비고
-1cache forever
0cache 하지 않음매번 DNS Server 에서 lookup
0 보다 큰 정수정해진 시간이 지났을 경우 DNS에서 새로 lookup60으로 설정시 60초가 지났을 경우 다시 DNS Server를 통해 lookup


변경하려면 $JRE/lib/security/java.security 파일의 다음 항목을 수정한다.

# networkaddress.cache.ttl=-1
networkaddress.cache.ttl=60


아니면 다음 java code 를 app 소스에서 호출해서 코드로 Java SecurityManager 를 수정해도 된다.

static {
    java.security.Security.setProperty ("networkaddress.cache.ttl" , "60");    
}


Ref