728x90
콘솔 애플리케이션에서 HTTP 서버를 멀티스레드로 호스팅하고, HttpOnly
및 Secure
속성이 설정된 쿠키를 생성하고 삭제하는 예제를 제공하겠습니다. 이 예제는 HttpListener
를 사용하여 간단한 HTTP 서버를 구축하고, 여러 스레드가 동시에 요청을 처리하며, 쿠키를 생성 및 삭제하는 방법을 포함합니다.
1. 프로젝트 생성
먼저, 콘솔 애플리케이션 프로젝트를 생성합니다:
dotnet new console -n HttpCookieMultiThreadExample
cd HttpCookieMultiThreadExample
2. Program.cs
파일 작성
다음은 멀티스레드 환경에서 HTTP 요청을 처리하고 HttpOnly
및 Secure
쿠키를 생성하고 삭제하는 코드입니다:
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"))
조건이 참이면HttpOnly
및Secure
속성이 설정된 쿠키를 생성합니다.
- 쿠키 삭제:
else if (request.Url.Query.Contains("action=delete"))
조건이 참이면 쿠키를 삭제합니다. 동일한 이름의 쿠키를 생성하고 만료 시간을 과거로 설정하여 클라이언트의 쿠키를 삭제합니다.
3.3. 응답 작성 및 전송
response.OutputStream.Write(buffer, 0, buffer.Length);
: 클라이언트에게 HTML 응답을 전송합니다.
4. 실행 및 테스트
서버 실행: 콘솔 애플리케이션을 실행합니다:
dotnet run
쿠키 생성 테스트:
- 브라우저에서
http://localhost:8080/?action=create
에 접속하면HttpOnly
및Secure
속성이 설정된 쿠키가 생성됩니다.
- 브라우저에서
쿠키 삭제 테스트:
- 브라우저에서
http://localhost:8080/?action=delete
에 접속하면 기존 쿠키가 삭제됩니다.
- 브라우저에서
5. 추가 고려사항
HTTPS 테스트:
Secure
쿠키는 HTTPS 연결에서만 전송되므로, 실제 테스트에서는 HTTPS 설정이 필요합니다. 로컬 개발 환경에서는 HTTP로 테스트하되,Secure
속성을 생략하거나, HTTPS를 설정하여 테스트해야 합니다.스레드 안전성:
HttpListener
와ConcurrentDictionary
를 사용하여 스레드 안전성을 확보하고 있지만, 실제 고성능 환경에서는 더 많은 고려가 필요할 수 있습니다.
이 코드를 통해 멀티스레드 환경에서 HTTP 요청을 처리하며, HttpOnly
및 Secure
쿠키를 생성하고 삭제하는 방법을 배울 수 있습니다.
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 |