
클라이언트 IP 가져오기
서버로의 요청이 프록시나 로드 밸런서를 거칠 때 클라이언트의 실제 IP 주소를 정확하게 가져오는 방법에 대해 알아보겠습니다. 기본적인 방법과 프록시 서버, 로드 밸런서 등의 환경에서 사용할 수 있는 방법을 설명하겠습니다.
기본 방법 : request.getRemoteAddr()
가장 기본적인 방법으로 HttpServletRequest 객체의 getRemoteAddr() 메서드를 사용하면 클라이언트의 IP 주소를 가져올 수 있습니다.
import javax.servlet.http.HttpServletRequest;
private String getClientIpAddress(HttpServletRequest request) {
request.getRemoteAddr();
}
이 방법은 클라이언트와 서버가 직접 통신할 때 유용합니다. 그러나 프록시 서버나 로드 밸런서를 사용하는 경우에는 프록시나 로드 밸런서의 IP 주소가 반환될 수 있습니다.
프록시나 로드밸런서를 통한 요청 처리 : 다양한 헤더 사용
프록시 서버나 로드 밸런서를 통해 서버에 요청이 전달될 때, 클라이언트의 실제 IP 주소는 다양한 헤더에 추가될 수 있습니다. 이러한 헤더를 확인하여 클라이언트의 실제 IP 주소를 가져올 수 있습니다.
X-Forwarded-For(XFF) 헤더
X-Forwarded-For 헤더는 프록시 서버나 로드 밸런서가 클라이언트의 원래 IP 주소를 전달하기 위해 사용하는 표준 헤더입니다. 이 헤더는 여러 IP 주소를 포함할 수 있으며, 각 주소는 쉼표로 구분됩니다. 첫 번째 IP 주소는 원래 클라이언트의 IP 주소를 나타내고, 나머지 주소는 프록시 서버나 로드 밸런서의 IP 주소를 나타냅니다.
- 주요 헤더
- Proxy-Client-IP
- WL-Proxy-Client-IP
- HTTP_CLIENT_IP
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- HTTP_VIA
- IPV6_ADR
- X-Real-IP
헤더 목록을 순회하여 유효한 IP 주소 찾기
import javax.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
public static String getClientIp(HttpServletRequest request) {
String clientIp = null;
boolean isIpInHeader = false;
List<String> headerList = new ArrayList<>();
headerList.add("X-Forwarded-For");
headerList.add("HTTP_CLIENT_IP");
headerList.add("HTTP_X_FORWARDED_FOR");
headerList.add("HTTP_X_FORWARDED");
headerList.add("HTTP_FORWARDED_FOR");
headerList.add("HTTP_FORWARDED");
headerList.add("Proxy-Client-IP");
headerList.add("WL-Proxy-Client-IP");
headerList.add("HTTP_VIA");
headerList.add("IPV6_ADR");
for (String header : headerList) {
clientIp = request.getHeader(header);
if (StringUtils.hasText(clientIp) && !"unknown".equalsIgnoreCase(clientIp)) {
isIpInHeader = true;
break;
}
}
if (!isIpInHeader) {
clientIp = request.getRemoteAddr();
}
return clientIp;
}
조건문을 통한 헤더 확인
조건문을 사용하여 순차적으로 여러 헤더를 확인하는 방법입니다.
import javax.servlet.http.HttpServletRequest;
public static String getClientIp(HttpServletRequest request) {
String clientIp = request.getHeader("X-Forwarded-For");
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("WL-Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("X-Real-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("X-RealIP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("REMOTE_ADDR");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getRemoteAddr();
}
return clientIp;
}
로컬 접속 시 실제 IP 주소 반환 - InetAddress
import java.net.InetAddress;
import java.net.UnknownHostException;
public static String getClientIp(HttpServletRequest request) throws UnknownHostException {
String clientIp = request.getHeader("X-Forwarded-For");
// 앞서 작성한 조건문 또는 헤더 순회 방법을 통해 clientIp 값 설정
if ("0:0:0:0:0:0:0:1".equals(clientIp) || "127.0.0.1".equals(clientIp)) {
InetAddress address = InetAddress.getLocalHost();
clientIp = address.getHostAddress();
}
return clientIp;
}
로컬에서 접속 시 로컬 루프백 주소인 127 대역이 반환되기 때문에 실제 IP 주소를 반환하려면 위 코드를 추가하면 됩니다.
'🖥 백엔드 개발 > 백엔드' 카테고리의 다른 글
[Java] 함수(Function)와 메서드(Method)의 차이점 (1) | 2024.03.05 |
---|---|
[Java] 불변성을 지닌 String 객체와 String pool 영역 (0) | 2023.12.05 |

클라이언트 IP 가져오기
서버로의 요청이 프록시나 로드 밸런서를 거칠 때 클라이언트의 실제 IP 주소를 정확하게 가져오는 방법에 대해 알아보겠습니다. 기본적인 방법과 프록시 서버, 로드 밸런서 등의 환경에서 사용할 수 있는 방법을 설명하겠습니다.
기본 방법 : request.getRemoteAddr()
가장 기본적인 방법으로 HttpServletRequest 객체의 getRemoteAddr() 메서드를 사용하면 클라이언트의 IP 주소를 가져올 수 있습니다.
import javax.servlet.http.HttpServletRequest;
private String getClientIpAddress(HttpServletRequest request) {
request.getRemoteAddr();
}
이 방법은 클라이언트와 서버가 직접 통신할 때 유용합니다. 그러나 프록시 서버나 로드 밸런서를 사용하는 경우에는 프록시나 로드 밸런서의 IP 주소가 반환될 수 있습니다.
프록시나 로드밸런서를 통한 요청 처리 : 다양한 헤더 사용
프록시 서버나 로드 밸런서를 통해 서버에 요청이 전달될 때, 클라이언트의 실제 IP 주소는 다양한 헤더에 추가될 수 있습니다. 이러한 헤더를 확인하여 클라이언트의 실제 IP 주소를 가져올 수 있습니다.
X-Forwarded-For(XFF) 헤더
X-Forwarded-For 헤더는 프록시 서버나 로드 밸런서가 클라이언트의 원래 IP 주소를 전달하기 위해 사용하는 표준 헤더입니다. 이 헤더는 여러 IP 주소를 포함할 수 있으며, 각 주소는 쉼표로 구분됩니다. 첫 번째 IP 주소는 원래 클라이언트의 IP 주소를 나타내고, 나머지 주소는 프록시 서버나 로드 밸런서의 IP 주소를 나타냅니다.
- 주요 헤더
- Proxy-Client-IP
- WL-Proxy-Client-IP
- HTTP_CLIENT_IP
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- HTTP_VIA
- IPV6_ADR
- X-Real-IP
헤더 목록을 순회하여 유효한 IP 주소 찾기
import javax.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
public static String getClientIp(HttpServletRequest request) {
String clientIp = null;
boolean isIpInHeader = false;
List<String> headerList = new ArrayList<>();
headerList.add("X-Forwarded-For");
headerList.add("HTTP_CLIENT_IP");
headerList.add("HTTP_X_FORWARDED_FOR");
headerList.add("HTTP_X_FORWARDED");
headerList.add("HTTP_FORWARDED_FOR");
headerList.add("HTTP_FORWARDED");
headerList.add("Proxy-Client-IP");
headerList.add("WL-Proxy-Client-IP");
headerList.add("HTTP_VIA");
headerList.add("IPV6_ADR");
for (String header : headerList) {
clientIp = request.getHeader(header);
if (StringUtils.hasText(clientIp) && !"unknown".equalsIgnoreCase(clientIp)) {
isIpInHeader = true;
break;
}
}
if (!isIpInHeader) {
clientIp = request.getRemoteAddr();
}
return clientIp;
}
조건문을 통한 헤더 확인
조건문을 사용하여 순차적으로 여러 헤더를 확인하는 방법입니다.
import javax.servlet.http.HttpServletRequest;
public static String getClientIp(HttpServletRequest request) {
String clientIp = request.getHeader("X-Forwarded-For");
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("WL-Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("X-Real-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("X-RealIP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("REMOTE_ADDR");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getRemoteAddr();
}
return clientIp;
}
로컬 접속 시 실제 IP 주소 반환 - InetAddress
import java.net.InetAddress;
import java.net.UnknownHostException;
public static String getClientIp(HttpServletRequest request) throws UnknownHostException {
String clientIp = request.getHeader("X-Forwarded-For");
// 앞서 작성한 조건문 또는 헤더 순회 방법을 통해 clientIp 값 설정
if ("0:0:0:0:0:0:0:1".equals(clientIp) || "127.0.0.1".equals(clientIp)) {
InetAddress address = InetAddress.getLocalHost();
clientIp = address.getHostAddress();
}
return clientIp;
}
로컬에서 접속 시 로컬 루프백 주소인 127 대역이 반환되기 때문에 실제 IP 주소를 반환하려면 위 코드를 추가하면 됩니다.
'🖥 백엔드 개발 > 백엔드' 카테고리의 다른 글
[Java] 함수(Function)와 메서드(Method)의 차이점 (1) | 2024.03.05 |
---|---|
[Java] 불변성을 지닌 String 객체와 String pool 영역 (0) | 2023.12.05 |