728x90

콘솔 애플리케이션에서 HTTP 서버를 멀티스레드로 호스팅하고, HttpOnlySecure 속성이 설정된 쿠키를 생성하고 삭제하는 예제를 제공하겠습니다. 이 예제는 HttpListener를 사용하여 간단한 HTTP 서버를 구축하고, 여러 스레드가 동시에 요청을 처리하며, 쿠키를 생성 및 삭제하는 방법을 포함합니다.

1. 프로젝트 생성

먼저, 콘솔 애플리케이션 프로젝트를 생성합니다:

dotnet new console -n HttpCookieMultiThreadExample
cd HttpCookieMultiThreadExample

2. Program.cs 파일 작성

다음은 멀티스레드 환경에서 HTTP 요청을 처리하고 HttpOnlySecure 쿠키를 생성하고 삭제하는 코드입니다:

using System;
using System.Net;
using System.Text;
using System.Threading;
using System.Collections.Concurrent;

class Program
{
    private static readonly HttpListener listener = new HttpListener();
    private static readonly ConcurrentDictionary<string, string> sessionStore = new ConcurrentDictionary<string, string>();
    private static readonly int threadCount = 10;

    static void Main(string[] args)
    {
        // HttpListener 설정
        listener.Prefixes.Add("http://localhost:8080/");
        listener.Start();
        Console.WriteLine("HTTP 서버가 실행 중입니다...");

        // 멀티스레드로 요청 처리
        for (int i = 0; i < threadCount; i++)
        {
            Thread thread = new Thread(ProcessRequests);
            thread.Start();
        }

        // 서버 종료 대기
        Console.WriteLine("아무 키나 눌러서 서버를 종료하세요...");
        Console.ReadLine();
        listener.Stop();
    }

    private static void ProcessRequests()
    {
        while (listener.IsListening)
        {
            try
            {
                // 클라이언트 요청 수신
                var context = listener.GetContext();
                var request = context.Request;
                var response = context.Response;

                // 클라이언트가 보낸 쿠키 확인
                string clientCookie = request.Cookies["UserCookie"]?.Value;
                if (clientCookie != null)
                {
                    Console.WriteLine($"클라이언트 쿠키: {clientCookie}");
                }
                else
                {
                    Console.WriteLine("클라이언트 쿠키 없음");
                }

                // 요청의 쿼리 문자열에 따라 쿠키 생성 또는 삭제
                if (request.Url.Query.Contains("action=create"))
                {
                    // HttpOnly 및 Secure 쿠키 생성
                    Cookie cookie = new Cookie("UserCookie", "SecureValue")
                    {
                        HttpOnly = true,
                        Secure = true,
                        Expires = DateTime.Now.AddMinutes(10) // 쿠키 만료 시간 설정
                    };
                    response.Cookies.Add(cookie);
                    Console.WriteLine("HttpOnly 및 Secure 쿠키가 생성되었습니다.");
                }
                else if (request.Url.Query.Contains("action=delete"))
                {
                    // 쿠키 삭제를 위해 동일한 이름의 쿠키를 생성하고 만료 시간을 과거로 설정
                    Cookie cookie = new Cookie("UserCookie", "")
                    {
                        HttpOnly = true,
                        Secure = true,
                        Expires = DateTime.Now.AddDays(-1) // 과거 날짜로 설정하여 쿠키 삭제
                    };
                    response.Cookies.Add(cookie);
                    Console.WriteLine("쿠키가 삭제되었습니다.");
                }

                // 응답 내용 작성
                string responseString = "<html><body>쿠키 생성 또는 삭제 작업 완료.</body></html>";
                byte[] buffer = Encoding.UTF8.GetBytes(responseString);

                // 응답 전송
                response.ContentLength64 = buffer.Length;
                response.OutputStream.Write(buffer, 0, buffer.Length);
                response.OutputStream.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"예외 발생: {ex.Message}");
            }
        }
    }
}

3. 코드 설명

3.1. 멀티스레드 처리

  • for (int i = 0; i < threadCount; i++): 여러 스레드를 생성하여 ProcessRequests 메서드를 동시에 실행합니다. 각 스레드는 클라이언트 요청을 비동기적으로 처리합니다.

3.2. 쿠키 생성 및 삭제

  • 쿠키 생성:
    • if (request.Url.Query.Contains("action=create")) 조건이 참이면 HttpOnlySecure 속성이 설정된 쿠키를 생성합니다.
  • 쿠키 삭제:
    • else if (request.Url.Query.Contains("action=delete")) 조건이 참이면 쿠키를 삭제합니다. 동일한 이름의 쿠키를 생성하고 만료 시간을 과거로 설정하여 클라이언트의 쿠키를 삭제합니다.

3.3. 응답 작성 및 전송

  • response.OutputStream.Write(buffer, 0, buffer.Length);: 클라이언트에게 HTML 응답을 전송합니다.

4. 실행 및 테스트

  1. 서버 실행: 콘솔 애플리케이션을 실행합니다:

    dotnet run
  2. 쿠키 생성 테스트:

    • 브라우저에서 http://localhost:8080/?action=create에 접속하면 HttpOnlySecure 속성이 설정된 쿠키가 생성됩니다.
  3. 쿠키 삭제 테스트:

    • 브라우저에서 http://localhost:8080/?action=delete에 접속하면 기존 쿠키가 삭제됩니다.

5. 추가 고려사항

  • HTTPS 테스트: Secure 쿠키는 HTTPS 연결에서만 전송되므로, 실제 테스트에서는 HTTPS 설정이 필요합니다. 로컬 개발 환경에서는 HTTP로 테스트하되, Secure 속성을 생략하거나, HTTPS를 설정하여 테스트해야 합니다.

  • 스레드 안전성: HttpListenerConcurrentDictionary를 사용하여 스레드 안전성을 확보하고 있지만, 실제 고성능 환경에서는 더 많은 고려가 필요할 수 있습니다.

이 코드를 통해 멀티스레드 환경에서 HTTP 요청을 처리하며, HttpOnlySecure 쿠키를 생성하고 삭제하는 방법을 배울 수 있습니다.

728x90
반응형

'Software > C#' 카테고리의 다른 글

C# 시작하기 - 세션  (0) 2024.08.19
C# 시작하기 - 멀티스레드  (0) 2024.08.17
C# 시작하기 - 피아노 소리  (0) 2024.07.29
C# 시작하기 - WebSocket  (0) 2024.07.28
MAUI 시작하기 - HttpClient 및 WebSocket  (0) 2024.07.28

+ Recent posts