ASP.NET 4.7.2 C# MVC에 대 한 SameSite cookie 샘플SameSite cookie sample for ASP.NET 4.7.2 C# MVC

.NET Framework 4.7는 SameSite 특성에 대 한 기본 제공 지원을 제공 하지만 원래 표준을 준수 합니다..NET Framework 4.7 has built-in support for the SameSite attribute, but it adheres to the original standard. 패치 된 동작이 SameSite.None의 의미를 변경 하 여 값을 전혀 내보내지 않고 None값으로 특성을 내보냅니다.The patched behavior changed the meaning of SameSite.None to emit the attribute with a value of None, rather than not emit the value at all. 값을 내보내지 않으려면 쿠키의 SameSite 속성을-1로 설정 하면 됩니다.If you want to not emit the value you can set the SameSite property on a cookie to -1.

SameSite 특성 작성Writing the SameSite attribute

다음은 쿠키에 SameSite 특성을 작성 하는 방법의 예입니다.Following is an example of how to write a SameSite attribute on a cookie;

// Create the cookie
HttpCookie sameSiteCookie = new HttpCookie("SameSiteSample");

// Set a value for the cookieSite none.
// Note this will also require you to be running on HTTPS
sameSiteCookie.Value = "sample";

// Set the secure flag, which Chrome's changes will require for Same
sameSiteCookie.Secure = true;

// Set the cookie to HTTP only which is good practice unless you really do need
// to access it client side in scripts.
sameSiteCookie.HttpOnly = true;

// Add the SameSite attribute, this will emit the attribute with a value of none.
// To not emit the attribute at all set the SameSite property to -1.
sameSiteCookie.SameSite = SameSiteMode.None;

// Add the cookie to the response cookie collection
Response.Cookies.Add(sameSiteCookie);

영어 이외의 언어로이 문서를 읽는 경우 네이티브 언어로 작성 된 코드 주석을 보려는 경우이 GitHub 토론 문제 를 알려주세요.If you are reading this in a language other than English, let us know in this GitHub discussion issue if you’d like to see the code comments in your native language.

세션 상태에 대 한 기본 sameSite 특성은 세션 설정의 ' cookieSameSite ' 매개 변수에 설정 됩니다 web.configThe default sameSite attribute for session state is set in the 'cookieSameSite' parameter of the session settings in web.config

<system.web>
  <sessionState cookieSameSite="None">     
  </sessionState>
</system.web>

MVC 인증MVC Authentication

OWIN MVC 쿠키 기반 인증에서는 쿠키 관리자를 사용 하 여 쿠키 특성을 변경할 수 있습니다.OWIN MVC cookie based authentication uses a cookie manager to enable the changing of cookie attributes. SameSiteCookieManager.cs 는 고유한 프로젝트로 복사할 수 있는 이러한 클래스의 구현입니다.The SameSiteCookieManager.cs is an implementation of such a class which you can copy into your own projects.

Owin 구성 요소가 모두 버전 4.1.0 이상으로 업그레이드 되었는지 확인 해야 합니다.You must ensure your Microsoft.Owin components are all upgraded to version 4.1.0 or greater. packages.config 파일에서 모든 버전 번호가 일치 하는지 확인 합니다 (예:).Check your packages.config file to ensure all the version numbers match, for example.

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <!-- other packages -->
  <package id="Microsoft.Owin.Host.SystemWeb" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security.Cookies" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net472" />
  <package id="Owin" version="1.0" targetFramework="net472" />
</packages>

그런 다음, 시작 클래스에서 CookieManager를 사용 하도록 인증 구성 요소를 구성 해야 합니다.The authentication components must then be configured to use the CookieManager in your startup class;

public void Configuration(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        CookieSameSite = SameSiteMode.None,
        CookieHttpOnly = true,
        CookieSecure = CookieSecureOption.Always,
        CookieManager = new SameSiteCookieManager(new SystemWebCookieManager())
    });
}

쿠키 관리자는이를 지 원하는 구성 요소에서 설정 해야 합니다. 여기에는 CookieAuthentication 및 OpenIdConnectAuthentication이 포함 됩니다.A cookie manager must be set on each component that supports it, this includes CookieAuthentication and OpenIdConnectAuthentication.

SystemWebCookieManager는 응답 쿠키 통합과 관련 하 여 알려진 문제 를 방지 하는 데 사용 됩니다.The SystemWebCookieManager is used to avoid known issues with response cookie integration.

샘플 실행Running the sample

샘플 프로젝트를 실행 하는 경우 초기 페이지에서 브라우저 디버거를 로드 하 고이를 사용 하 여 사이트에 대 한 쿠키 컬렉션을 봅니다.If you run the sample project load your browser debugger on the initial page and use it to view the cookie collection for the site. Edge 및 Chrome에서이 작업을 수행 하려면 F12를 클릭 한 다음 Application 탭을 선택 하 고 Storage 섹션의 Cookies 옵션 아래에서 사이트 URL을 클릭 합니다.To do so in Edge and Chrome press F12 then select the Application tab and click the site URL under the Cookies option in the Storage section.

브라우저 디버거 쿠키 목록

위의 이미지에서 볼 수 있습니다. 예를 들어 "쿠키 만들기" 단추를 클릭 하면 샘플 코드에 설정 된 값과 일치 하는 LaxSameSite 특성 값이 있습니다.You can see from the image above that the cookie created by the sample when you click the "Create Cookies" button has a SameSite attribute value of Lax, matching the value set in the sample code.

제어 하지 않는 쿠키 가로채기Intercepting cookies you do not control

.NET 4.5.2는 Response.AddOnSendingHeaders헤더 쓰기를 가로채기 위한 새 이벤트를 도입 했습니다..NET 4.5.2 introduced a new event for intercepting the writing of headers, Response.AddOnSendingHeaders. 이는 쿠키를 클라이언트 컴퓨터에 반환 하기 전에 가로채는 데 사용할 수 있습니다.This can be used to intercept cookies before they are returned to the client machine. 이 샘플에서는 브라우저가 새로운 sameSite 변경 내용을 지원 하는지 여부를 확인 하는 정적 메서드에 이벤트를 연결 하 고, 그렇지 않은 경우 새 None 값이 설정 된 경우에서 특성을 내보내지 않도록 쿠키를 변경 합니다.In the sample we wire up the event to a static method which checks whether the browser supports the new sameSite changes, and if not, changes the cookies to not emit the attribute if the new None value has been set.

이벤트를 처리 하 고 사용자의 코드에 복사할 수 있는 쿠키 sameSite 특성을 조정 하는 예제는 global.asax 를 참조 하세요.See global.asax for an example of hooking up the event and SameSiteCookieRewriter.cs for an example of handling the event and adjusting the cookie sameSite attribute which you can copy into your own code.

public static void FilterSameSiteNoneForIncompatibleUserAgents(object sender)
{
    HttpApplication application = sender as HttpApplication;
    if (application != null)
    {
        var userAgent = application.Context.Request.UserAgent;
        if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
        {
            HttpContext.Current.Response.AddOnSendingHeaders(context =>
            {
                var cookies = context.Response.Cookies;
                for (var i = 0; i < cookies.Count; i++)
                {
                    var cookie = cookies[i];
                    if (cookie.SameSite == SameSiteMode.None)
                    {
                        cookie.SameSite = (SameSiteMode)(-1); // Unspecified
                    }
                }
            });
        }
    }
}

동일한 방식으로 명명 된 쿠키의 특정 동작을 변경할 수 있습니다. 아래 샘플은 Lax에서 None 값을 지 원하는 브라우저에 None 기본 인증 쿠키를 조정 하거나 None를 지원 하지 않는 브라우저에서 sameSite 특성을 제거 합니다.You can change specific named cookie behavior in much the same way; the sample below adjust the default authentication cookie from Lax to None on browsers which support the None value, or removes the sameSite attribute on browsers which do not support None.

public static void AdjustSpecificCookieSettings()
{
    HttpContext.Current.Response.AddOnSendingHeaders(context =>
    {
        var cookies = context.Response.Cookies;
        for (var i = 0; i < cookies.Count; i++)
        {
            var cookie = cookies[i]; 
            // Forms auth: ".ASPXAUTH"
            // Session: "ASP.NET_SessionId"
            if (string.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal))
            { 
                if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
                {
                    cookie.SameSite = -1;
                }
                else
                {
                    cookie.SameSite = SameSiteMode.None;
                }
                cookie.Secure = true;
            }
        }
    });
}

추가 정보More Information

Chrome 업데이트Chrome Updates

OWIN SameSite 설명서OWIN SameSite Documentation

ASP.NET 설명서ASP.NET Documentation

.NET SameSite 패치.NET SameSite Patches