.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
헤더 정보는 브라우저의 개발자 모드(f12키)를 통해서 Network 콘솔에서 확인할 수 있다.
Headers 정보에서 Remote Address, X-Forward-For 헤더와 응답 내용들을 확인할 수 있다.
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기준의 가장 처음 값을 가져오게 된다.
'.Net' 카테고리의 다른 글
.Net bootstrap - Tab Menu 만들기 (0) | 2020.11.13 |
---|---|
.Net/core - 무료 Icon, Font Awesome 5 사용하기 (0) | 2020.11.13 |
.NET core 3.1 - ActionLink glyphicon 사용하기 (0) | 2020.11.09 |
.NET core 3.1 - File Download (0) | 2020.11.09 |
.Net - Web application Ubuntu 배포하기 (0) | 2020.11.08 |