728x90

멀티스레드 환경에서 콘솔 애플리케이션을 통해 HTTP 호스팅을 구현하고, 세션 및 쿠키를 관리하는 것은 고도의 기술이 요구되는 작업입니다. 이는 특히 고성능 서버 애플리케이션을 개발하거나 테스트 환경을 구축할 때 유용합니다. 이번에는 C# 콘솔 애플리케이션에서 HTTP 서버를 호스팅하고, 세션과 쿠키를 관리하는 방법을 단계별로 설명하겠습니다.

1. .NET Core로 HTTP 서버 호스팅

먼저, C# 콘솔 애플리케이션에서 HttpListener 클래스를 사용하여 간단한 HTTP 서버를 호스팅합니다. 이 서버는 멀티스레드로 클라이언트의 요청을 처리하며, 세션과 쿠키를 관리합니다.

1.1. 프로젝트 생성

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

dotnet new console -n HttpSessionCookieExample
cd HttpSessionCookieExample

1.2. Program.cs 수정

다음은 HttpListener를 사용해 HTTP 서버를 호스팅하고, 멀티스레드 환경에서 세션 및 쿠키를 처리하는 코드입니다:

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 response = context.Response;
                var request = context.Request;

                // 쿠키에서 세션 ID 가져오기
                string sessionId = GetOrCreateSessionId(request);
                Console.WriteLine($"세션 ID: {sessionId}");

                // 세션에 데이터 저장
                sessionStore[sessionId] = "Hello from session " + sessionId;

                // 세션 데이터와 쿠키 전송
                string responseString = $"<html><body>{sessionStore[sessionId]}</body></html>";
                byte[] buffer = Encoding.UTF8.GetBytes(responseString);

                response.ContentLength64 = buffer.Length;
                response.OutputStream.Write(buffer, 0, buffer.Length);

                // 세션 쿠키 설정
                response.SetCookie(new Cookie("SessionId", sessionId));
                response.OutputStream.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"예외 발생: {ex.Message}");
            }
        }
    }

    private static string GetOrCreateSessionId(HttpListenerRequest request)
    {
        string sessionId = null;
        if (request.Cookies["SessionId"] != null)
        {
            sessionId = request.Cookies["SessionId"].Value;
        }

        // 세션 ID가 없으면 새로 생성
        if (sessionId == null || !sessionStore.ContainsKey(sessionId))
        {
            sessionId = Guid.NewGuid().ToString();
            sessionStore.TryAdd(sessionId, null);
        }

        return sessionId;
    }
}

2. 코드 설명

2.1. HttpListener 설정 및 요청 처리

HttpListener는 .NET에서 HTTP 서버를 간단하게 구현할 수 있는 클래스입니다. 위 코드는 localhost:8080에서 HTTP 요청을 수신하고, 멀티스레드로 요청을 처리합니다.

  • listener.Prefixes.Add("http://localhost:8080/");: 서버가 수신할 URL 접두사를 지정합니다.
  • 멀티스레드 처리: 각 스레드는 ProcessRequests 메서드를 실행하여 클라이언트 요청을 처리합니다.

2.2. 세션 관리

세션 ID는 클라이언트의 쿠키에서 읽어오거나, 존재하지 않는 경우 새로 생성됩니다. 세션 데이터는 ConcurrentDictionary를 사용하여 스레드 안전하게 관리됩니다.

  • GetOrCreateSessionId 메서드: 세션 ID를 쿠키에서 가져오거나 새로 생성합니다.
  • sessionStore: 각 세션 ID와 연결된 데이터를 저장하는 스레드 안전한 컬렉션입니다.

2.3. 쿠키 처리

세션 ID는 쿠키를 통해 클라이언트와 서버 간에 유지됩니다. 서버는 응답 시 세션 ID를 쿠키로 설정하고, 클라이언트는 이를 다음 요청에서 다시 전송합니다.

  • response.SetCookie(new Cookie("SessionId", sessionId));: 서버가 세션 ID를 클라이언트에 전달하기 위해 쿠키를 설정합니다.

3. 실행 및 테스트

코드를 작성한 후 프로젝트를 실행합니다:

dotnet run

이제 브라우저에서 http://localhost:8080/로 접속하여 서버가 클라이언트의 요청을 처리하고 세션 데이터를 관리하는 것을 확인할 수 있습니다. 각 브라우저 세션은 고유한 세션 ID를 할당받아 서버와의 지속적인 상호작용에서 사용됩니다.

4. 추가 고려사항

4.1. 스레드 안전성

이 구현은 ConcurrentDictionary를 사용하여 스레드 간 데이터 접근을 안전하게 처리합니다. 그러나 실제 서버 환경에서는 더 복잡한 동시성 관리 기법이 필요할 수 있습니다.

4.2. 확장성

이 구현은 간단한 HTTP 서버를 위한 것이며, 대규모 웹 애플리케이션에서는 ASP.NET Core와 같은 프레임워크를 사용하는 것이 더 적합합니다. 이러한 프레임워크는 세션 관리, 쿠키 처리, 보안 등을 더 효율적으로 지원합니다.

4.3. 보안 고려

세션 ID는 클라이언트-서버 간의 중요한 식별 정보이므로, HTTPS를 사용하여 데이터 전송 중에 이를 암호화하는 것이 필수적입니다. 또한, 세션 하이재킹을 방지하기 위해 적절한 보안 대책을 마련해야 합니다.

이와 같은 방법을 통해 C# 콘솔 애플리케이션에서 HTTP 서버를 호스팅하고, 멀티스레드 환경에서 세션과 쿠키를 관리할 수 있습니다. 이러한 기술은 경량 서버 구현이나 특정 테스트 시나리오에서 매우 유용하게 사용될 수 있습니다.

728x90
반응형

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

C# 시작하기 - System.IO.Directory  (0) 2025.01.11
C# 시작하기 - System.IO.File  (0) 2025.01.11
C# 시작하기 - HTTP 쿠키  (0) 2024.08.17
C# 시작하기 - 멀티스레드  (0) 2024.08.17
C# 시작하기 - 피아노 소리  (0) 2024.07.29

+ Recent posts