asp.net mvc .net framework 4.6.2 에서 cookie SameSite 적용하기
asp.net mvc 이며 .net framework 4.6.2 환경에서 cookie 의 SameSite 에 대해 직접 Lax 를 지정해 보고자 합니다.
우선 asp.net mvc 의 .net 버전이 4.6.2 라고 해도, 별도로 서버에 .net framework 4.7.2 를 설치해야 합니다. 이게 설치 후 서버를 재시작 해야 합니다. 흠... 재시작이 안된다고 하시면, URL Rewrite 모듈을 별도로 설치해서 아래와 같이 web.config 파일을 열어서, outboundRole 로 패턴에 맞게 지정해야 합니다.
web.config 에는 단지 SameSite 에 대한 정의를 하지 않았으므로 기본값인 none 이 되어 아래와 같이 기본적으로 제공하는 _RequestVerificationToken 값이 없습니다. 단, web.config 에 cookie 설정을 httpOnlyCookies 를 true 지정해서 httpOnly 가 체크되어 있습니다.
asp.net mvc identity 의 인증 부분이 기술되어 있는 Startup.Auth.cs 파일에 가보시면, 인증쿠키를 생성하는 ConfigureAuth 함수 내부에 아래와 같이 기술되어 있습니다. 여기 보면 인증쿠키를 UnivCookie라고 명명을 해서 사용중에 있습니다. web.config 의 httpCookies 속성에 할당된 sameSite 값을 그대로 여기에도 동일하게 반영하고자 하는데요.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString(LoginPathUrl),
LogoutPath = new PathString(LogoutPathUrl),
CookieDomain = "workhour.univ.me",
CookieName = "UnivCookie",
ExpireTimeSpan = TimeSpan.FromMinutes(CookieTimeout),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the AppMember logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, string>(
validateInterval: TimeSpan.FromMinutes(CookieTimeout),//9시간
regenerateIdentityCallback: (manager, ApplicationUser) =>
ApplicationUser.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (id.GetUserId())),
OnApplyRedirect = ctx =>
추가부분이라고 기술되어 있는 "CookieManager = new SystemWebChunkingCookieManager()" 를 추가하면 인증 쿠키도 동일하게 적용되어 반영됩니다.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString(LoginPathUrl),
LogoutPath = new PathString(LogoutPathUrl),
CookieDomain = "workhour.univ.me",
CookieName = "UnivCookie",
ExpireTimeSpan = TimeSpan.FromMinutes(CookieTimeout),
CookieManager = new SystemWebChunkingCookieManager(), //추가부분
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the AppMember logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, string>(
validateInterval: TimeSpan.FromMinutes(CookieTimeout),//9시간
regenerateIdentityCallback: (manager, ApplicationUser) =>
ApplicationUser.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (id.GetUserId())),
OnApplyRedirect = ctx =>
SystemWebChunkingCookieManager() 클래스 내부는 오픈소스로 아래과 같이 제공합니다. nuget 으로 부터 Microsoft.Owin.Host.SystemWeb 를 설치하면 간단히 해결 됩니다.