Java/Spring

[Spring] ํด๋ผ์ด์–ธํŠธ ์‹ค์ œ IP ๊ฐ€์ ธ์˜ค๊ธฐ (X-Forwarded-For)

U__q 2026. 3. 9. 11:10
728x90

๐Ÿ“ [Spring] ํด๋ผ์ด์–ธํŠธ ์‹ค์ œ IP ๊ฐ€์ ธ์˜ค๊ธฐ (X-Forwarded-For)

์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์‚ฌ์šฉ์ž์˜ ์‹ค์ œ IP๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด

  • ๋กœ๊ทธ์ธ ๊ธฐ๋ก ์ €์žฅ
  • ์‚ฌ์šฉ์ž ํ™œ๋™ ๋กœ๊ทธ
  • ๊ด€๋ฆฌ์ž ๊ฐ์‚ฌ ๋กœ๊ทธ

Spring Boot์—์„œ๋Š” HttpServletRequest๋ฅผ ํ†ตํ•ด IP๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ
๋‹จ์ˆœํžˆ request.getRemoteAddr()๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ ์‚ฌ์šฉ์ž IP๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ IP๊ฐ€ ์กฐํšŒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring Boot์—์„œ ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. ๊ธฐ๋ณธ IP ์กฐํšŒ ๋ฐฉ๋ฒ•

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ HttpServletRequest์˜ getRemoteAddr()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

public String getClientIp(HttpServletRequest request) {
	return request.getRemoteAddr();
}
 
ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๊ตฌ์กฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

Client → Load Balancer → Server
 

์ด ๊ฒฝ์šฐ getRemoteAddr()์€ Load Balancer์˜ IP๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์‹ค์ œ ์‚ฌ์šฉ์ž IP๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. X-Forwarded-For ํ—ค๋” ํ™•์ธ

ํ”„๋ก์‹œ ์„œ๋ฒ„๋‚˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š”
์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP๋ฅผ X-Forwarded-For ํ—ค๋”์— ๋‹ด์•„์„œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

X-Forwarded-For: 203.0.113.195
 
๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ—ค๋”๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public String getClientIp(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");

    // 1. X-Forwarded-For ํ—ค๋” ์ฒ˜๋ฆฌ
    if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
        // ์—ฌ๋Ÿฌ IP๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ IP๋ฅผ ์„ ํƒํ•˜๊ณ  ๊ณต๋ฐฑ ์ œ๊ฑฐ(.trim())
        if (ip.contains(",")) {
            return ip.split(",")[0].trim();
        }
        return ip;
    }

    // 2. ๋‹ค๋ฅธ ํ”„๋ก์‹œ ํ—ค๋” ํ™•์ธ (์ˆœ์ฐจ์ )
    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");
    }

    // 3. ๋ชจ๋“  ํ—ค๋”์— ์—†์œผ๋ฉด ์ตœ์ข…์ ์œผ๋กœ RemoteAddr ํ™•์ธ
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }

    return ip;
}

 

 

3. ์—ฌ๋Ÿฌ IP๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ

X-Forwarded-For์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ IP๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ

X-Forwarded-For: clientIP, proxy1, proxy2
 

์ด ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ IP๊ฐ€ ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ IP์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public String getClientIp(HttpServletRequest request) {

    String ip = request.getHeader("X-Forwarded-For");

    if (ip != null && ip.contains(",")) {
    	ip = ip.split(",")[0];
    }

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    	ip = request.getRemoteAddr();
    }

    return ip;
}

 

 
 

4. ์‚ฌ์šฉ ์˜ˆ์‹œ

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์ˆ˜์ • ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ๋•Œ IP๋ฅผ ํ•จ๊ป˜ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
String clientIp = getClientIp(request);

user.setModIp(clientIp);
 

DB์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

mod_ip = 203.0.113.195
 
 

5. ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์‹ค์ œ๋กœ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[User Update Log]

user_id : admin
mod_ip : 203.0.113.195
 

๋˜๋Š” ์ฝ˜์†” ๋กœ๊ทธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

System.out.println("Client IP : " + clientIp);
 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

Client IP : 203.0.113.195
 

์ •๋ฆฌ

Spring Boot์—์„œ ํด๋ผ์ด์–ธํŠธ IP๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. request.getRemoteAddr() ์‚ฌ์šฉ
  2. ํ”„๋ก์‹œ ํ™˜๊ฒฝ์—์„œ๋Š” X-Forwarded-For ํ™•์ธ
  3. ์—ฌ๋Ÿฌ IP๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๊ฐ’ ์‚ฌ์šฉ

์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ํ”„๋ก์‹œ๋‚˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—
X-Forwarded-For ํ—ค๋”๋ฅผ ํ•จ๊ป˜ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

728x90