본문 바로가기

네트워크/HTTP

프리플라이트 preflight 란 무엇인가 | ChatGPT

728x90
반응형

프리플라이트 preflight

프리플라이트(preflight) 요청은 웹 애플리케이션이 CORS(Cross-Origin Resource Sharing)를 사용하여 다른 도메인으로 리소스를 요청할 때, 안전성을 보장하기 위해 사전 요청을 보내는 과정입니다.

주로 HTTP 메서드가 GET이나 POST가 아니거나, 커스텀 헤더가 사용되는 경우, 또는 특정 Content-Type이 사용될 때 발생합니다.

프리플라이트 요청의 흐름

🔵 옵션(OPTIONS) 요청

클라이언트는 먼저 서버에 HTTP OPTIONS 메서드를 사용하여 프리플라이트 요청을 보냅니다.

이 요청에는 실제 요청에서 사용하려는 메서드와 헤더 정보가 포함됩니다.

🔵 서버의 응답

서버는 프리플라이트 요청에 응답하여 클라이언트가 요청을 진행해도 되는지 여부를 알려줍니다.

이 응답에는 허용된 메서드, 허용된 헤더, 그리고 허용된 오리진(출처) 등이 포함됩니다.

🔵 실제 요청 전송

서버가 프리플라이트 요청을 승인하면, 클라이언트는 이후 실제 요청을 전송하게 됩니다.

프리플라이트 요청이 필요한 경우

  • PUT, DELETE, PATCH와 같은 메서드가 사용될 때.
  • Content-Type이 application/json, application/xml 등 기본 값이 아닌 경우.
  • 커스텀 헤더가 사용될 때 (예: X-Custom-Header).

예시

만약 클라이언트가 다른 도메인에 PUT 요청을 보내려고 한다면, 브라우저는 이 요청이 안전한지 확인하기 위해 프리플라이트 요청을 먼저 보냅니다.

프리플라이트 요청:

OPTIONS /some-resource HTTP/1.1
Host: example.com
Origin: http://another-domain.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header

서버의 응답:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://another-domain.com
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Headers: X-Custom-Header

서버가 허용한다고 응답하면, 클라이언트는 실제 PUT 요청을 진행합니다.

프리플라이트 요청은 보안상의 이유로 브라우저에서 자동으로 처리된다.

개발자는 서버에서 CORS 설정을 통해 이를 허용할지 여부를 결정할 수 있습니다.

ASP.NET에서 프리플라이트 요청 처리

ASP.NET (ASP.NET Framework)에서는 프리플라이트 요청을 처리하기 위해 웹 API나 MVC 애플리케이션에서 CORS 설정을 구성해야 합니다. ASP.NET Core와 다르게, ASP.NET에서는 별도의 NuGet 패키지를 사용하거나 HTTP 모듈을 구성하여 CORS를 처리합니다.

ASP.NET에서 프리플라이트 요청 처리 방법

ASP.NET Framework에서 프리플라이트 요청을 처리하려면 Microsoft.AspNet.WebApi.Cors 패키지를 사용하여 설정할 수 있습니다.

다음은 ASP.NET Web API에서 프리플라이트 요청을 처리하는 단계입니다:

1. NuGet 패키지 설치

Microsoft.AspNet.WebApi.Cors 패키지를 설치합니다.

Install-Package Microsoft.AspNet.WebApi.Cors

2. WebApiConfig.cs에 CORS 설정 추가

CORS 설정을 Web API 설정에 추가합니다.

using System.Web.Http;
using System.Web.Http.Cors;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 특정 도메인, 메서드, 헤더를 허용하는 CORS 정책 설정
        var cors = new EnableCorsAttribute("https://allowed-origin.com", "*", "*");
        config.EnableCors(cors);

        // Web API 경로 설정 등
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

위 설정에서 "https://allowed-origin.com"은 허용할 출처를 나타내며, "*"는 모든 헤더와 메서드를 허용하도록 설정합니다.

이를 통해 프리플라이트 요청이 자동으로 처리됩니다.

3. 프리플라이트 요청 확인 방법

프리플라이트 요청을 확인하려면 ASP.NET의 HTTP 모듈이나 로그를 사용하여 요청을 기록할 수 있습니다.

예를 들어, 프리플라이트 요청을 로그에 기록하려면 다음과 같이 Global.asax의 Application_BeginRequest 이벤트를 사용할 수 있습니다:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var context = HttpContext.Current;
    if (context.Request.HttpMethod == "OPTIONS")
    {
        // 프리플라이트 요청을 확인
        System.Diagnostics.Debug.WriteLine("Preflight request detected!");
        System.Diagnostics.Debug.WriteLine($"Request Method: {context.Request.HttpMethod}");
        System.Diagnostics.Debug.WriteLine($"Request Headers: {context.Request.Headers}");
    }
}

이 코드는 OPTIONS 메서드로 들어오는 프리플라이트 요청을 로그에 기록하여 확인할 수 있게 해줍니다.

중요한 점

  • CORS 설정은 클라이언트와 서버 간의 보안 설정을 다루므로, 올바르게 설정해야 합니다. 잘못된 설정은 요청이 거부되거나 예기치 않은 보안 문제가 발생할 수 있습니다.
  • 브라우저 개발 도구의 네트워크 탭을 활용하여 실제로 프리플라이트 요청이 어떻게 처리되는지 확인하는 것도 좋은 방법입니다. OPTIONS 요청을 필터링하여 확인하면 됩니다.

이 방법을 사용하면 ASP.NET에서도 프리플라이트 요청을 제대로 처리하고, 설정을 통해 프리플라이트 요청을 확인할 수 있습니다.

출처 | ChatGPT

728x90
반응형