ASP.NET Core 세션(Session)이란?
세션(Session)은 ASP.NET Core에서 사용자 데이터를 저장하고 관리할 수 있게 해주는 기능입니다.
세션은 서버 측의 딕셔너리(Dictionary)에 데이터를 저장하며, SessionId가 그 키(key)로 사용됩니다. SessionId는 클라이언트 측에서 쿠키 형태로 저장되고, 모든 요청마다 함께 전송됩니다.
SessionId 쿠키는 브라우저별로 발급되기 때문에 서로 다른 브라우저 간에는 공유할 수 없습니다. 또한 별도의 만료 시간이 지정되어 있지 않아 브라우저 세션이 종료되면 자동으로 삭제됩니다.
반면 서버 측 세션은 제한된 시간 동안만 유지됩니다. 기본 세션 타임아웃은 20분이며, 필요에 따라 자유롭게 변경할 수 있습니다.
세션 미들웨어 패키지 설치
Microsoft.AspNetCore.Session 패키지는 ASP.NET Core에서 세션을 관리하는 미들웨어를 제공합니다. 애플리케이션에서 세션을 사용하려면 이 패키지를 프로젝트 파일(project.json)의 종속성으로 추가해야 합니다.
패키지를 설치한 후에는 Startup 클래스에서 세션을 구성합니다. Startup 클래스의 ConfigureServices 메서드 내에서 AddSession 메서드를 호출하면 됩니다.
AddSession 메서드는 오버로드(overload)를 하나 제공하며, 이를 통해 유휴 시간 초과(Idle Timeout), 쿠키 이름(Cookie Name), 쿠키 도메인(Cookie Domain) 등 다양한 세션 옵션을 지정할 수 있습니다. 옵션을 전달하지 않으면 시스템 기본값이 적용됩니다.
예제 코드
다음은 Startup 클래스에서 세션을 구성하고 미들웨어 파이프라인에 등록하는 예제입니다.
public class Startup {
public void Configure(IApplicationBuilder app){
app.UseSession();
app.UseMvc();
app.Run(context => {
return context.Response.WriteAsync("Hello World!");
});
}
public void ConfigureServices(IServiceCollection services){
services.AddDistributedMemoryCache();
services.AddMvc();
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(60);
});
}
}
위 코드에서는 세션 저장소로 분산 메모리 캐시(AddDistributedMemoryCache)를 등록했으며, 유휴 시간 초과(IdleTimeout)를 60분으로 설정했습니다. 즉, 마지막 요청으로부터 60분이 경과하면 해당 사용자의 세션 데이터가 삭제됩니다. 참고로 app.UseSession()은 반드시 app.UseMvc()보다 먼저 호출해야 정상적으로 동작합니다.
세션 데이터 접근 방법
컨트롤러에서는 HttpContext.Session 객체를 통해 세션에 접근할 수 있습니다. 문자열 데이터는 SetString 메서드로 저장하고 GetString 메서드로 조회하며, 그 외에도 정수형을 위한 SetInt32/GetInt32, 바이트 배열을 위한 Set/Get 등의 확장 메서드가 제공됩니다. 이러한 확장 메서드를 사용하려면 Microsoft.AspNetCore.Http 네임스페이스를 참조해야 합니다.
public class HomeController : Controller{
[Route("home/index")]
public IActionResult Index(){
HttpContext.Session.SetString("product", "laptop");
return View();
}
[Route("home/GetSessionData")]
public IActionResult GetSessionData(){
ViewBag.data = HttpContext.Session.GetString("product");
return View();
}
}
위 예제에서 Index 액션은 "product"라는 키로 "laptop" 값을 세션에 저장하고, GetSessionData 액션은 동일한 키로 값을 읽어 ViewBag에 담아 뷰에 전달합니다.
참고: 최신 .NET 버전에서의 구성
project.json 기반의 초기 ASP.NET Core 버전이 아닌, .NET 6 이상의 최소 호스팅 모델(minimal hosting model) 프로젝트에서는 Startup.cs 대신 Program.cs에서 builder.Services.AddSession(...)과 app.UseSession()을 호출하여 동일하게 세션을 구성하고 사용할 수 있습니다.