반응형

기본적으로 아파치를 앞단에 두는 경우 access_log에서 IP를 확인할 수가 있는데,

Proxy를 타고 들어오는 경우, 해당 Proxy의 IP만 확인이 되게 된다.


이럴 경우 Request Header의 X-Forwarded-For 옵션을 참조하여,

진짜 클라이언트 IP와 Proxy IP를 둘다 가져올 수가 있다.



1. Apache Access 로그에서 확인하기 

LogFormat에 들어가서 아래 내용을 교체한다.

가장 뒤에 붙은 common은 alias같은 역할을 하니, 자신이 사용하는 LogFormat을 잘 찾아서 교체해주어야 한다.

## 수정전
## LogFormat "%h %l %u %t \"%r\" %>s %b" common

## 수정후
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common


2. Was를 이용하여 확인하기 

String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = request.getHeader("Proxy-Client-IP"); 
} 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = request.getHeader("WL-Proxy-Client-IP"); 
} 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = request.getHeader("HTTP_CLIENT_IP"); 
} 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
} 
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = request.getRemoteAddr(); 
}


3. Spring을 이용하여 확인하기 

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";
    }
}
반응형
,