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 | 의미 | 비고 |
---|---|---|
-1 | cache forever | default |
0 | cache 하지 않음 | 매번 DNS Server 에서 lookup |
0 보다 큰 정수 | TTL 시간 | 60으로 설정시 60초가 지났을 경우 다시 DNS Server를 통해 lookup |
networkaddress.cache.negative.ttl
실패한 DNS lookup 에 대해 cache 할지 여부이며 기본 설정은 10 이다.
value | 의미 | 비고 |
---|---|---|
-1 | cache forever | |
0 | cache 하지 않음 | 매번 DNS Server 에서 lookup |
0 보다 큰 정수 | 정해진 시간이 지났을 경우 DNS에서 새로 lookup | 60으로 설정시 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
- https://developers.google.com/recaptcha/docs/java?hl=ko
- http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html#nct
- http://docs.oracle.com/javase/7/docs/api/