본문 바로가기
프로그래밍/C#

UseForwardedHeaders를 이용해서 클라이언트 실제 IP 얻기

by bantomak 2025. 5. 19.
반응형

C#에서 클라이언트 실제 IP 얻기

UseForwardedHeaders() 메서드는 서버가 Resverse Proxy(역방향 프록시) 뒤에 위치할 때 클라이언트의 실제 IP 주소나 요청 프로토콜(HTTP, HTTPS) 정보를 올바르게 인식하기 위해 설정한다.

 

프록시(예: Nginx, Envoy, AWS ALB)를 사용할 경우,

  • ASP.NET Core 앱은 기본적으로 프록시의 IP나 프로토콜만 인식
  • 실제 클라이언트의 IP 주소나 HTTPS 여부를 알고 싶을 땐 HTTP 헤더 (X-Forwarded-For, X-Forwarded-Proto)를 해석해야 한다.

이걸 가능하게 해주는 것이 바로 app.UserForwardedHeaders(...)이다.

예제 코드

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
    ForwardedForHeaderName = "X-Envoy-External-Address"
});

app.UseForwardedHeaders(...)로 설정

  • ASP.NET Core 미들웨어 파이프라인에서 요청 헤더 정보를 파싱하고 주입한다.
  • 이걸 사용하지 않으면 프록시를 통해 전달된 클라이언트 정보가 HttpContext.Connection.RemoteIpAddress 등에 반영되지 않는다.

컨트롤러 코드 예제

[ApiController]
[Route("api/[controller]")]
public class IpController : ControllerBase
{
    [HttpGet("myip")]
    public IActionResult GetClientIp()
    {
        var ip = HttpContext.Connection.RemoteIpAddress?.ToString();
        return Ok(new { clientIp = ip });
    }
}

API GET 요청 예시

Envoy > ASP.NET Core 구조에서 클라이언트가 요청을 보냈다면,

GET / HTTP/1.1
Host: myapi.com
X-Envoy-External-Address: 203.0.113.99
X-Forwarded-Proto: https

이때 위에 미들웨어 설정이 없다면

  • RemoteIpAddress > Envoy IP만 보임
  • Request.Scheme > http로 고정

하지만 위 코드를 추가하면:

  • RemoteIpAddress > 203.0.113.99로 설정됨
  • Request.Scheme > https로 바뀜

댓글