멀티스레드 환경에서 콘솔 애플리케이션을 통해 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 서버를 호스팅하고, 멀티스레드 환경에서 세션과 쿠키를 관리할 수 있습니다. 이러한 기술은 경량 서버 구현이나 특정 테스트 시나리오에서 매우 유용하게 사용될 수 있습니다.
'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 |