호환성: 응용 프로그램 간 인증 쿠키 공유하기

등록일시: 2017-05-12 08:00,  수정일시: 2017-05-12 08:00
조회수: 5,145
이 문서는 ASP.NET Core 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 ASP.NET Core 응용 프로그램들 간에, 그리고 ASP.NET 4.x 응용 프로그램과 ASP.NET Core 응용 프로그램 간에 인증 쿠키를 공유하는 방법을 살펴봅니다.

일반적으로 웹 사이트는 서로 조화롭게 동작하는 다수의 개별적인 웹 응용 프로그램으로 구성되는 경우가 많습니다. 따라서 응용 프로그램 개발자가 좋은 Single Sign-On 경험을 제공하기 위해서는, 사이트에 존재하는 모든 개별적인 웹 응용 프로그램들 간에 서로 인증 티켓을 공유해야 하는 경우가 종종 발생합니다.

이런 시나리오에 대응하기 위해서, 데이터 보호 스택은 Katana 쿠키 인증 및 ASP.NET Core 쿠키 인증 티켓의 공유를 지원합니다.

응용 프로그램 간 인증 쿠키 공유하기

두 개의 다른 ASP.NET Core 응용 프로그램 간에 서로 인증 쿠키를 공유하려면, 쿠키를 공유할 응용 프로그램들을 각각 다음과 같이 구성합니다.

구성 메서드 내에서 CookieAuthenticationOptions를 이용해서 쿠키에 관련된 데이터 보호 서비스를 설정하고 AuthenticationScheme을 ASP.NET 4.X에 적합하게 설정합니다.

역주

이 부분의 AuthenticationScheme과 관련된 설명은 원문의 저자가 다음 절의 내용까지 염두에 둔 것으로 보입니다. AuthenticationScheme에 관한 보다 자세한 설명은 ASP.NET Core Identity 없이 Cookie 미들웨어 사용하기 문서를 참고하시기 바랍니다.

ASP.NET Core Identity를 사용 중인 경우:

app.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
    options.Cookies.ApplicationCookie.AuthenticationScheme = "ApplicationCookie";
    options.Cookies.ApplicationCookie.DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"c:\shared-auth-ticket-keys\"));
});

쿠키 미들웨어를 직접 사용할 경우:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"c:\shared-auth-ticket-keys\"))
});

DataProtectionProvider를 사용하려면 Microsoft.AspNetCore.DataProtection.Extensions NuGet 패키지가 필요합니다.

이 방식을 사용할 경우, DirectoryInfo는 인증 쿠키 전용으로 따로 준비된 키 저장소의 위치를 가리켜야 합니다. 이 쿠키 인증 미들웨어는 명시적으로 제공된 DataProtectionProvider의 구현을 사용하게 되는데, 이 DataProtectionProvider는 응용 프로그램의 다른 영역에서 사용되는 데이터 보호 시스템과 격리됩니다. 이때, 응용 프로그램들 간의 격리를 위해서 삽입되는 응용 프로그램 이름은 무시됩니다 (이는 의도적인 것으로, 여러 응용 프로그램에서 페이로드를 공유하려고 시도하고 있기 때문입니다).

주의

다음 예제처럼 DataProtectionProvider를 구성해서 저장된 비활성 키를 암호화하는 방안을 고려하시기 바랍니다.

 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
     DataProtectionProvider = DataProtectionProvider.Create(
         new DirectoryInfo(@"c:\shared-auth-ticket-keys\"),
         configure =>
         {
             configure.ProtectKeysWithCertificate("thumbprint");
         })
 });

ASP.NET 4.x 응용 프로그램과 ASP.NET Core 응용 프로그램 간 인증 쿠키 공유하기

Katana 쿠키 인증 미들웨어를 사용하는 ASP.NET 4.x 응용 프로그램은 ASP.NET Core 쿠키 인증 미들웨어와 호환되는 인증 쿠키를 생성하도록 구성할 수 있습니다. 이를 활용하면 대규모 사이트를 구성하는 각각의 응용 프로그램들을 단계적으로 업그레이드 하면서, 동시에 계속해서 사이트 전체에 걸친 원활한 Single Sign 경험을 제공할 수 있습니다.

프로젝트의 Startup.Auth.cs 파일에서 UseCookieAuthentication을 호출하는 코드가 존재하는지 확인해보면 기존 응용 프로그램이 Katana 쿠키 미들웨어를 사용하는지 여부를 알 수 있습니다. Visual Studio 2013 및 그 이후 버전에서 생성된 ASP.NET 4.x 웹 응용 프로그램은 기본적으로 Katana 쿠키 인증 미들웨어를 사용합니다.

노트

ASP.NET 4.x 응용 프로그램은 .NET Framework 4.5.1 또는 그 이후 버전을 대상으로 해야 합니다. 그렇지 않으면 필수 NuGet 패키지가 설치되지 않습니다.

ASP.NET 4.x 응용 프로그램과 ASP.NET Core 응용 프로그램 간에 인증 쿠키를 공유하려면, 이전 절에서 설명한 것처럼 ASP.NET Core 응용 프로그램을 구성하고 다음과 같은 과정에 따라 ASP.NET 4.x 응용 프로그램을 구성하십시오.

  1. Microsoft.Owin.Security.Interop 패키지를 대상 ASP.NET 4.x 응용 프로그램에 설치합니다.

  2. Startup.Auth.cs 파일에서 UseCookieAuthentication을 호출하는 코드를 찾습니다. 일반적으로 다음과 같은 형태를 띄고 있습니다.

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        // ...
    });
  3. 다음과 같이 UseCookieAuthentication 호출을 수정해서, CookieName을 ASP.NET Core 쿠키 인증 미들웨어에서 사용되는 이름과 동일하게 변경하고, 키 저장소 경로를 전달해서 초기화 한 DataProtectionProvider의 인스턴스를 제공하고, 청크 형식이 호환되도록 CookieManager를 Interop ChunkingCookieManager로 설정합니다.

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        CookieName = ".AspNetCore.Cookies",
        // CookiePath = "...", (if necessary)
        // ...
        TicketDataFormat = new AspNetTicketDataFormat(
            new DataProtectorShim(
                DataProtectionProvider.Create(new DirectoryInfo(@"c:\shared-auth-ticket-keys\"))
                .CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
                "Cookies", "v2"))),
        CookieManager = new ChunkingCookieManager()
    });

    DirectoryInfo는 ASP.NET Core 응용 프로그램에서 지정한 저장소 위치와 동일한 경로를 가리켜야 하고 동일한 설정을 사용해서 구성돼야 합니다.

이렇게 구성하면 ASP.NET 4.x 및 ASP.NET Core 응용 프로그램이 인증 쿠키를 공유하게 됩니다.

노트

각 응용 프로그램들의 Identity 시스템이 동일한 사용자 데이터베이스를 바라보고 있는지 확인해야 합니다. 그렇지 않으면, 런타임 시에 Identity 시스템이 인증 쿠키의 정보와 데이터베이스의 정보가 일치하는지 여부를 확인할 때 오류가 발생합니다.