[Web] XFF - Load balancers ํน์ Proxy ํ๊ฒฝ์์ Client IP ๊ฐ์ ธ์ค๊ธฐ
๊ธฐ์กด์๋ request.getRemoteAddr(); ๋ฅผ ํตํด Client์ IP๋ฅผ ๊ฐ์ ธ์๋๋ฐ ์น์๋ฒ๋ WAS ์์ L4์ ๊ฐ์ Load balancers๋ Proxy server, caching server๋ฑ์ด ์๋ ๊ฒฝ์ฐ๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์๋ค.
์ด๋ฐ ์ ํ์ ์น์๋ฒ ํน์ WAS์ HTTP๋ AJP ์์ฒญ์ ๋ณด๋ธ ํ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณตํ์ฌ ํด๋ผ์ด์ธํธ์ ์ฌ์ ์กํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ํ์์ด ๋ฐ์ํ ๊ฒ์ด๋ค. ( ํด๋ผ์ด์ธํธ IP -> ๋ก๋๋ฐธ๋ฐ์, ํ๋ก์ ์ฅ๋น -> ์น์๋ฒ )
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด XFF(X-Forwarded-For)์ด๋ค!
XFF ์๋ Client์ Proxy IP ๊ฐ ์ฝค๋ง๋ฅผ ๊ตฌ๋ถ์๋ก ๋ค์ด๊ฐ๊ฒ ๋์ด์๋๋ฐ ์์๋ ์๋์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฒซ๋ฒ์งธ IP๋ฅผ ๊ฐ์ ธ์ค๋ฉด Client์ IP๋ฅผ ํ๋ํ ์ ์๋ค.
X-Forwarded-For: client, proxy1, proxy2
XFF๋ ํ์ค์ด์ง๋ง ์ ์ RFC์ ํฌํจ๋๊ฒ ์๋๋ผ ๋ชจ๋ ์ ํ์ด XFF ํค๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ค.
์๋ฅผ ๋ค์ด WebLogic Connector(mod_wl) ๋ XFF ํค๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ WL-Proxy-Client-IP ๋ Proxy-Client-IP ํค๋๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ ์ ํ์ ์ข ๋ฅ์ ์ํฅ์ ๋ฐ์ง ์๊ณ Client IP๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํด์ผ ํ๋ค.
public String getClientIp(HttpServletRequest request) {
String ip = null;
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();
}
log.debug("Client IP : " + ip);
return ip;
}