본문 바로가기
.Net

.Net/C#/Core - How to Get Client IP on HTTP

by 올엠 2020. 11. 10.
반응형

.Net Core를 개발하면서 기존 C#과 앞으로 .Net core(.Net)에서 어떻게 다른지 정리하는 글을 남긴다.

클라이언트 IP를 가져올때 주의할점은 프록시 서버를 이용하는 경우를 대비해서 X-Forward-For 헤더를 확인할 필요가 있다는 것이다.

X-Forward-For 는 아래 글에 잘 정리되어 있는데, 현재 전송된 HTTP 패킷이 어떤 프록시 서버를 거쳤는지, 그리고 실제 Client IP는 무엇인지 확인이 가능한 헤더이다.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For

 

X-Forwarded-For

The X-Forwarded-For (XFF) header is a de-facto standard header for identifying the originating IP address of a client connecting to a web server through an HTTP proxy or a load balancer. When traffic is intercepted between clients and servers, server acces

developer.mozilla.org

헤더 정보는 브라우저의 개발자 모드(f12키)를 통해서 Network 콘솔에서 확인할 수 있다.

Headers 정보에서 Remote Address, X-Forward-For 헤더와 응답 내용들을 확인할 수 있다.

 

Headers 정보

 

1. C#

C#에서는 헤더를 직접 확인하는 구조로 진행한다.

HTTP_X_FORWARDED_FOR 에 값이 있다면, 이 값을 사용하고 없다면, 프록시 사용을 하지 않았기 때문에 REMOTE_ADDR 헤더의 값을 사용하게 된다. REMOTE_ADDR 가  Remote Address 를 뜻한다.

        public string GetIp()
        {
            string ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (string.IsNullOrEmpty(ip))
            {
                ip = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }
            return ip;
        }

 

2. .Net/core

.Net 코어에서는 기본적으로는 Remote Address 만 가져올 수 있다.

        public string GetIp()
        {
            string ip = Request.HttpContext.Connection.RemoteIpAddress.ToString();
            return ip;
        }

X-Forward-For 헤더를 추가하고자 한다면, Startup.cs 에 다음 내용을 추가하자.

using Microsoft.AspNetCore.HttpOverrides;


//....중략....
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
        //....중략....
            app.UseForwardedHeaders(new ForwardedHeadersOptions
            {
                ForwardedHeaders = ForwardedHeaders.XForwardedFor |
                ForwardedHeaders.XForwardedProto
            });
        //....중략....
        }

위 내용을 추가하면 RemoteIpAddress를 가져올때 X-Forward-For 정보를 우선 확인하여 가져오게 된다.

다만 링크에서 얘기한 것과 같이 Proxy Address로 여러개의 값이 존재할 수 있다. 그리고 IPv6 버전 정보로 표시되는 상황도 있기 때문에, GetIp를 다음과 같이 수정하면 보다 완성도가 있는 코드가 될 것이다.

        public string GetIp()
        {
            IPAddress remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;

            if (remoteIpAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
            {
                remoteIpAddress = System.Net.Dns.GetHostEntry(remoteIpAddress).AddressList.First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
            }
            return remoteIpAddress.ToString();
        }

위와 같이 수정하게 되면, IPv4기준의 가장 처음 값을 가져오게 된다.

반응형