티스토리 뷰

이 페이지에서는 IP, Agent, 브라우저, OS등의 접속자 정보를 가져오는 방법에 대해 설명하고 있다.

 

# IP

X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 사실상의 표준이다.

(X-Forwarded-For 은 이메일 메시지가 다른 계정으로부터 포워딩되었음을 나타내는 이메일 헤더이기도 하다)

 

XFF를 사실상의 표준이라고 표현하는 이유는, 정식 RFC 에 포함된게 아니어서 다른 헤더를 사용하는 경우가 있기 때문이다.

그래서 WebServer, WAS, L4, proxy 종류에 상관없이 원하는 client IP를 가져오게 하려면 먼저 해당 헤더가 있는지 확인하는 방식을 추가하여 아래와 같은 방식으로 코드를 작성해야한다.

String ip = request.getHeader("X-FORWARDED-FOR"); 
if (ip == null || ip.length() == 0) { 
	ip = request.getHeader("Proxy-Client-IP"); 
}
if (ip == null || ip.length() == 0) { 
	ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0) { 
	ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0) { 
	ip = request.getRemoteAddr(); 
}

 

 

참고 사이트 - mozilla

 

X-Forwarded-For

X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 사실상의 표준 헤더다. 클라이언트와 서버 중간에서 트래픽이 프록시나 로드 밸런서를 거치면, 서버 접근 로그에는 프록시나 로드 밸런서의 IP 주소만을 담고 있다. 클라이언트의 원 IP 주소를 보기위해 X-Forwarded-For 요청 헤더가 사용된다.

developer.mozilla.org

 

# User Agent

사용자 에이전트란, 사용자를 대신하여 일을 수행하는 소프트웨어 에이전트로서 세션 개시 프로토콜에서는 통신 세션 양 쪽 끝을 말한다.

소프트웨어 에이전트가 네트워크 프로토콜 안에서 동작할 때, 식별 문자열을 피어에 제출함으로써 애플리케이션 유형, 운영체제, 소프트웨어 업체, 리비전을 식별할 수 있다. [출처 - 위키백과]

String agent = request.getHeader("User-Agent");

 

위에서 언급한 것처럼 사용자 에이전트를 통해 브라우저, 운영체제를 식별 할 수 있다. 원하는 항목이 포함되어 있는지 체크하는 방식으로 코드를 작성한다.

 

1) browser

String brower = null; 

if (agent != null) { 
 if (agent.indexOf("Trident") > -1) { 
	brower = "MSIE"; 
} else if (agent.indexOf("Chrome") > -1) { 
	brower = "Chrome"; 
} else if (agent.indexOf("Opera") > -1) { 
	brower = "Opera"; 
} else if (agent.indexOf("iPhone") > -1 && agent.indexOf("Mobile") > -1) { 
	brower = "iPhone"; 
} else if (agent.indexOf("Android") > -1 && agent.indexOf("Mobile") > -1) { 
	brower = "Android"; 
} 


2) OS

String os = null; 

if(agent.indexOf("NT 6.0") != -1) os = "Windows Vista/Server 2008"; 
else if(agent.indexOf("NT 5.2") != -1) os = "Windows Server 2003"; 
else if(agent.indexOf("NT 5.1") != -1) os = "Windows XP"; 
else if(agent.indexOf("NT 5.0") != -1) os = "Windows 2000"; 
else if(agent.indexOf("NT") != -1) os = "Windows NT"; 
else if(agent.indexOf("9x 4.90") != -1) os = "Windows Me"; 
else if(agent.indexOf("98") != -1) os = "Windows 98"; 
else if(agent.indexOf("95") != -1) os = "Windows 95"; 
else if(agent.indexOf("Win16") != -1) os = "Windows 3.x"; 
else if(agent.indexOf("Windows") != -1) os = "Windows"; 
else if(agent.indexOf("Linux") != -1) os = "Linux"; 
else if(agent.indexOf("Macintosh") != -1) os = "Macintosh"; 
else os = "";

 

3) mobile OS

String[] mobileos = {"iPhone", "iPod", "Android", "BlackBerry", "Windows CE", "Nokia", "Webos", "Opera Mini", "SonyEricsson", "Opera Mobi", "IEMobile"};

if (agent != null && !agent.equals("")) {
	for(int i = 0; i < mobileos.length; i++) {
		if (agent.indexOf(mobileos[i]) > -1) {
			System.out.println(mobileos[i]);
		}
	}
}
댓글
최근에 올라온 글
«   2024/05   »
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
Total
Today
Yesterday