Skip to content

Commit c503f8b

Browse files
committed
refactor: IpUtil 코드 구조화 개선
- 매직넘버 상수화 - 메서드 책임별 분리
1 parent beb05e8 commit c503f8b

1 file changed

Lines changed: 45 additions & 31 deletions

File tree

  • src/main/java/life/mosu/mosuserver/global/util
Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,62 @@
11
package life.mosu.mosuserver.global.util;
22

33
import jakarta.servlet.http.HttpServletRequest;
4-
import java.net.InetAddress;
5-
import java.net.UnknownHostException;
4+
import java.util.List;
5+
import java.util.Arrays;
6+
import java.util.stream.Stream;
7+
8+
import lombok.Getter;
9+
import lombok.RequiredArgsConstructor;
610
import lombok.experimental.UtilityClass;
711

812
@UtilityClass
913
public class IpUtil {
1014

11-
public static String getClientIp(HttpServletRequest request) throws UnknownHostException {
12-
String ip = request.getHeader("X-Forwarded-For");
15+
private static final List<String> IP_HEADERS = Arrays.asList(
16+
"X-Forwarded-For",
17+
"Proxy-Client-IP",
18+
"WL-Proxy-Client-IP",
19+
"HTTP_CLIENT_IP",
20+
"HTTP_X_FORWARDED_FOR",
21+
"X-Real-IP"
22+
);
23+
24+
public static String getClientIp(HttpServletRequest request) {
25+
String ip = IP_HEADERS.stream()
26+
.map(request::getHeader)
27+
.filter(IpUtil::isValidIp)
28+
.findFirst()
29+
.orElse(request.getRemoteAddr());
30+
31+
String proxiedIp = resolveProxiedIp(ip);
32+
return Loopback.resolve(proxiedIp);
33+
}
1334

35+
private static String resolveProxiedIp(String ip) {
1436
if (ip != null && ip.contains(",")) {
15-
ip = ip.split(",")[0].trim();
37+
return ip.split(",")[0].trim();
1638
}
39+
return ip;
40+
}
1741

18-
if (isInvalidIp(ip)) {
19-
ip = request.getHeader("Proxy-Client-IP");
20-
}
21-
if (isInvalidIp(ip)) {
22-
ip = request.getHeader("WL-Proxy-Client-IP");
23-
}
24-
if (isInvalidIp(ip)) {
25-
ip = request.getHeader("HTTP_CLIENT_IP");
26-
}
27-
if (isInvalidIp(ip)) {
28-
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
29-
}
30-
if (isInvalidIp(ip)) {
31-
ip = request.getHeader("X-Real-IP");
32-
}
33-
if (isInvalidIp(ip)) {
34-
ip = request.getRemoteAddr();
35-
}
42+
private static boolean isValidIp(String ip) {
43+
return ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip);
44+
}
3645

37-
if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
38-
InetAddress inetAddress = InetAddress.getLocalHost();
39-
ip = inetAddress.getHostName() + "/" + inetAddress.getHostAddress();
40-
}
46+
@RequiredArgsConstructor
47+
@Getter
48+
private enum Loopback {
49+
V4("127.0.0.1"),
50+
V6("0:0:0:0:0:0:0:1");
4151

42-
return ip;
43-
}
52+
private final String address;
4453

45-
private static boolean isInvalidIp(String ip) {
46-
return ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip);
54+
public static boolean isLoopback(String ip) {
55+
return Arrays.stream(Loopback.values())
56+
.anyMatch(loopback -> loopback.getAddress().equals(ip));
57+
}
58+
public static String resolve(String ip) {
59+
return isLoopback(ip) ? "localhost" : ip;
60+
}
4761
}
4862
}

0 commit comments

Comments
 (0)