nickjoIT
Java - Client IP 가져오기 본문
관리자 ID일 경우 로그인 할 때 사외 IP로 접근 시에 로그인이 되지 않도록 해둔 로직이 있었는데, 어느 순간부터 사내에 있는 PC로 접근했는데도 로그인이 되지 않는 일이 발생했습니다. 문제를 찾아보니 웹 서버에 접근할 때 L4(Load balancing)이나 Proxy 서버 등을 사용할 때 request.getRemoteAddr(); 로 IP를 가져오면 Client IP가 아니라 L4나 Proxy 서버의 IP를 가져오는 것을 알 수 있었습니다. 이런 장비들의 경우 Client IP를 Header에다가 남겨둔다고 합니다. 따라서, Client IP를 가져오기 위해서는 다음과 같은 로직을 사용해야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import javax.servlet.http.HttpServletRequest; public class IPTraceUtils { public static String getRemoteAddr(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.getHeader("X-Real-IP"); } if (ip null || ip.length() 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-RealIP"); } if (ip null || ip.length() 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("REMOTE_ADDR"); } if (ip null || ip.length() 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } } | cs |
이런식으로 해주면 본래 Client의 IP를 가져올 수 있습니다. 여기서 getHeader의 문자들은 각 기기들이 주로 Client IP를 남기는 Header의 이름입니다. 아마도 저 정도면 거의 모든 Proxy 환경이나 L4에 대응이 가능할 겁니다. 더 자세한 정보나, 다른 언어에서 IP를 가져오고 싶은 경우에는 아래 링크를 확인하시기 바랍니다.
[참고]
'PROGRAMING > JAVA' 카테고리의 다른 글
스트림(stream) (0) | 2016.03.12 |
---|---|
람다식 (0) | 2016.03.09 |
지네릭스(Generics) (0) | 2016.03.08 |
컬렉션 프레임워크란 무엇인가 (0) | 2016.02.18 |
String과 StringBuffer의 차이점 (0) | 2016.02.18 |
Comments