본문 바로가기
Spring

[Spring]client IP 를 얻기 위한 X-Forwarded-For(XFF) http header

by 태진아밴드 2020. 1. 9.

회사 브랜드 페이지를 리뉴얼하게 되면서 기존에 없던 기능이 추가되었다.

 

당사 서비스를 휴대폰 번호만 입력받아 가상 체험할 수 있게끔 해주는 기능인데, 휴대폰 번호를 입력받으면

 

해당 휴대폰번호로 문자가 발송되는 시스템이였다.

 

해당 체험서비스 개발 완료 직전에 남용 방지를 위해 동일번호는 하루 2번,

 

같은 IP로는 하루 3번 제한을 두자는 정책이 나와 적용하기로 했다.

 

HttpRequest에 들어있는 header를 통해 client ip를 구하는 소스가 있어 이를 활용하였다.

 

public class IPaddress {
	
	public static String getIPaddress(HttpServletRequest req){
			
		String clientIp = req.getHeader("HTTP_X_FORWARDED_FOR");
		
        if(null == clientIp || clientIp.length() == 0 
		   || clientIp.toLowerCase().equals("unknown")){
		  clientIp = req.getHeader("REMOTE_ADDR");
		}
		 
		if(null == clientIp || clientIp.length() == 0 
		   || clientIp.toLowerCase().equals("unknown")){
		  clientIp = req.getRemoteAddr();
		}
		
		return clientIp;
	}

}

 

controller단에서 체험서비스 api를 호출시 해당 함수를 호출하여 접속 ip를 얻은 뒤

 

입력받은 휴대폰번호와 함께 DB에 select하여 설정한 조건에 부합하지 않으면 fail과 에러메세지를 보내주고

 

설정한 조건에 부합할경우 문자발송 서비스를 호출한 뒤 해당 정보를 insert하는 방식으로 구현하였다.

 

로컬에서 테스트를 마친 뒤 운영서버에 반영을 했는데

 

잉....? 왜 DB에 아이피가 이상하게 들어가는거지....?

 

그럼 그렇지 왠일로 한방에 잘 된다했다....

구글링 열심히 해본 결과 nginx + tomacat 서버 사용시 따로 설정을 잡아 줘야 한다고 했다.

 

해결 방안으로는 여러 방법들이 있었는데 저 getIPaddress 함수를 수정해서 해결했다.

 

public class IPaddress {
	
	public static String getIPaddress(HttpServletRequest req){
		
	 String clientIp = req.getHeader("X-Forwarded-For");
	 
	 if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { 
	     clientIp = req.getHeader("Proxy-Client-IP"); 
	 } 
	 if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { 
	     clientIp = req.getHeader("WL-Proxy-Client-IP"); 
	 } 
	 if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { 
	     clientIp = req.getHeader("HTTP_CLIENT_IP"); 
	 } 
	 if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { 
	     clientIp = req.getHeader("HTTP_X_FORWARDED_FOR"); 
	 } 
	 if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { 
	     clientIp = req.getRemoteAddr(); 
	 }
	
	 return clientIp;
	 
	}
	
}

 

저 순서대로 잡아주었더니 실서버에서도 IP를 제대로 가져와서 문제해결..!

 

찬양해요 갓 구글...!