반응형
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로 바뀜
'프로그래밍 > C#' 카테고리의 다른 글
C# 얕은 복사, 깊은 복사에 대해서 알아보자 (0) | 2025.05.19 |
---|---|
C# EF Core 사용시 DB 상태를 간단하게 체크하는 방법 (0) | 2025.05.19 |
C# Serilog에서 Sub-Logger를 이용해서 별도의 하위 로거 설정하기 (0) | 2025.05.16 |
비동기 메서드의 형식을 맞추기 위해서 필요한 Task.CompletedTask (0) | 2025.05.15 |
C# try-catch로 예외 상황을 컨트롤 해보자 (0) | 2025.05.14 |
댓글