다들 아시다시피, Nginx로 리버스 프록시 거는 건 이제 기본이잖아요?
근데 저희가 내부 개발 서버에 연결할 때 있잖아요.
사용자 실제 IP 주소를 정확하게 전달받는 게 중요한데, 헤더 설정할 때 자꾸 헷갈려서요.
X-Forwarded-For 같은 거 써야 하나요?
아니면 뭔가 다른 꼼수 같은 게 있을까요?
혹시 이거 제대로 꿀팁 아시는 분 계실까요?
ㅠㅠ 너무 딱딱한 답변 말고, 실사용 꿀팁 위주로 부탁드려요!
다들 아시다시피, Nginx로 리버스 프록시 거는 건 이제 기본이잖아요?
근데 저희가 내부 개발 서버에 연결할 때 있잖아요.
사용자 실제 IP 주소를 정확하게 전달받는 게 중요한데, 헤더 설정할 때 자꾸 헷갈려서요.
X-Forwarded-For 같은 거 써야 하나요?
아니면 뭔가 다른 꼼수 같은 게 있을까요?
혹시 이거 제대로 꿀팁 아시는 분 계실까요?
ㅠㅠ 너무 딱딱한 답변 말고, 실사용 꿀팁 위주로 부탁드려요!
아, 이거 진짜 많은 분들이 헷갈리는 부분이에요.
ㅠ 리버스 프록시 환경에서 클라이언트의 실제 IP를 제대로 가져오는 거, 이게 생각보다 함정이 많거든요.
단순히 X-Forwarded-For를 붙이는 것만으로는 '완벽'하다고 볼 수 없고, 몇 가지 케이스별로 알아야 할 게 있어요.
일단 결론부터 말씀드리면, 맞아요.
X-Forwarded-For 헤더를 사용하는 게 기본 원칙에 가깝습니다.
근데 이게 '꿀팁'이라기보다는 '필수 체크리스트'에 가깝다고 보셔야 해요.
왜냐하면 이게 동작하는 방식 자체가 여러 단계를 거치기 때문이에요.
--- ### 🧐 왜 IP 주소 전달이 헷갈리는가?
(원리 이해하기) 우리가 보통 웹 요청을 보낼 때, 요청을 받는 서버(백엔드 개발 서버)가 보는 IP는 '바로 앞단'의 IP 주소일 가능성이 높아요.
만약 구조가 [클라이언트] $\rightarrow$ [Nginx (프록시)] $\rightarrow$ [백엔드 서버] 라면, 백엔드 서버 입장에서 보면, 요청을 보낸 주소는 Nginx 서버의 IP가 되는 거죠.
그래서 '진짜 클라이언트 IP'가 누락되는 거예요.
이걸 해결하려고 HTTP 표준에서는 X-Forwarded-For (XFF) 헤더를 만들어서 "얘들아, 사실 이 요청은 저기서 왔어!" 하고 정보를 담아 보내는 거예요.
--- ###
상황별 헤더 처리 방법 및 실전 팁 실제 환경을 가정하고 몇 가지 시나리오로 나눠서 설명드릴게요.
1.
가장 일반적인 경우: Nginx $\rightarrow$ 백엔드 (단일 프록시) 이 경우, Nginx 설정에서 헤더를 백엔드로 넘겨주는 게 핵심입니다.
Nginx 설정 예시 (필수 체크): nginx proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; # 호스트 헤더도 같이 넘겨주는 게 좋습니다. 여기서 $proxy_add_x_forwarded_for라는 변수를 쓰는데, 이게 Nginx가 알아서 가장 앞에 클라이언트 IP를 붙여주는 기능을 해줍니다.
만약 이 설정을 안 하거나 잘못하면, Nginx가 자기 자신(프록시 서버)의 IP를 X-Forwarded-For의 첫 번째 값으로 박아버릴 수 있어요.
실전 팁 (중요): 백엔드 서버 코드 레벨에서도 이 헤더를 읽어와야 합니다.
예를 들어, 백엔드(Spring Boot 등)에서 요청을 받을 때, 단순히 request.getRemoteAddr()만 보면 Nginx의 IP가 나올 거예요.
이럴 땐 라이브러리나 코드를 이용해 X-Forwarded-For 헤더를 최우선으로 확인하도록 로직을 짜줘야 합니다.
2.
여러 대의 프록시를 거치는 경우 (CDN/로드 밸런서 $\rightarrow$ Nginx $\rightarrow$ 백엔드) 이게 가장 복잡하고 실수하기 쉬운 케이스예요.
만약 구조가 [클라이언트] $\rightarrow$ [AWS ELB/CloudFront] $\rightarrow$ [Nginx] $\rightarrow$ [백엔드] 라면, 요청은 최소 두 번의 '프록시링' 과정을 거칩니다.
이때는 X-Forwarded-For가 IP 주소의 목록 형태로 쌓이게 됩니다.
원래 클라이언트 IP $\rightarrow$ ELB IP $\rightarrow$ Nginx IP 순서로 적재되는 거죠.
주의사항 (가장 중요): * ELB/CloudFront 등의 서비스 자체에서 IP를 잘 처리해주는지 확인하세요.
(보통은 잘 처리해줍니다만, 설정 검토는 필수예요.) * Nginx 설정 시, 이미 존재하는 X-Forwarded-For 값에 현재 요청의 IP를 '추가'하는 방식을 써야 합니다.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 이 구문이 이 역할을 어느 정도 해줍니다.
️ 흔히 하는 실수와 반드시 체크해야 할 것들 1.X-Forwarded-For 외에 Forwarded 헤더도 고려해야 한다. 최신 HTTP 스펙이나 일부 대형 클라우드 환경에서는 X-Forwarded-For 대신 Forwarded 헤더를 사용하도록 권장하고 있습니다.Forwarded 헤더는 for=*, proto=https, host=example.com 같은 형태로 여러 정보를 담을 수 있어서 더 포괄적이에요.X-Forwarded-Proto (프로토콜: http/https)나 X-Forwarded-Port 같은 헤더도 함께 확인해야 할 수 있어요.nginx.conf)에서 헤더를 잘 넘겨주는 것과, 백엔드 애플리케이션 코드에서 그 헤더를 '신뢰'하고 사용하는 것은 완전히 별개의 문제입니다.request.getRemoteAddr()만 쓰면 소용없습니다. 반드시 X-Forwarded-For를 읽는 로직을 추가해야 해요.
요약 정리 (꿀팁 치트 시트) | 상황 | 필요한 헤더 | Nginx 설정 (핵심) | 백엔드 처리 (필수) | | :--- | :--- | :--- | :--- | | 단순 프록시 | X-Forwarded-For | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | X-Forwarded-For를 우선 확인 | | 복합 프록시 | X-Forwarded-For & Forwarded | 위 설정 유지 + Forwarded도 체크 | 두 헤더를 모두 확인 후, 첫 번째 IP를 신뢰 | | 프로토콜/호스트까지 | X-Forwarded-Proto, Host | proxy_set_header ... 추가 | 헤더 값으로 프로토콜 재구성 | 가장 중요한 건 '신뢰할 수 있는 출처'만 받아들이는 거예요. 만약 프록시 환경이 복잡해서 여러 헤더가 들어온다면, **"가장 왼쪽의 IP 주소(가장 먼저 기록된 IP)"**가 실제 클라이언트 IP일 확률이 가장 높다고 가정하고 코드를 짜는 게 업계의 일반적인 관행입니다.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
등록 로그인