๐ [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๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- request.getRemoteAddr() ์ฌ์ฉ
- ํ๋ก์ ํ๊ฒฝ์์๋ X-Forwarded-For ํ์ธ
- ์ฌ๋ฌ IP๊ฐ ์์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ๊ฐ ์ฌ์ฉ
์ค์ ์๋น์ค ํ๊ฒฝ์์๋ ํ๋ก์๋ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์
X-Forwarded-For ํค๋๋ฅผ ํจ๊ป ํ์ธํ๋ ๋ฐฉ์์ด ํ์ํฉ๋๋ค.