Spring 에서 client ip 가져오는 법.

  1. HttpServletRequest 의 getRemoteAddr() 를 호출하면 되므로  RequestContextHolder 를 통해 HttpServletRequest 획득

  2. WAS 는 보통 2차 방화벽 안에 있고 Web Server 를 통해 client 에서 호출되거나 cluster로 구성되어 load balancer 에서 호출되는데 이럴 경우에서 getRemoteAddr() 을 호출하면 웹서버나 load balancer의 IP 가 나옴
  3. 위와 같은 문제를 해결하기 위해 사용되는 HTTP Header 인 X-Forwarded-For 값을 확인해서 있으면 이걸 사용하고 없으면 getRemoteAddr() 사용

 

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
 
 
@Controller
public class HomeController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Model model) {	
		HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
		String ip = req.getHeader("X-FORWARDED-FOR");
		if (ip == null)
			ip = req.getRemoteAddr();
		
		model.addAttribute("clientIP", ip);
		return "home";
	}
}

WebLogic 의 web server 연계 모듈인 weblogic connector 는 위 헤더를 사용하지 않고 Proxy-Client-IP WL-Proxy-Client-IP 를 사용하므로 weblogic 에서 도는 application 작성시 수정이 필요함