ASP.NET Core에서 EU 데이터 보호 규정 GDPR (일반) 지원EU General Data Protection Regulation (GDPR) support in ASP.NET Core

작성자: Rick AndersonBy Rick Anderson

ASP.NET Core의 일부를 충족 하기 위해 Api 및 템플릿을 제공 합니다 EU 데이터 보호 규정 GDPR (일반) 요구 사항:ASP.NET Core provides APIs and templates to help meet some of the EU General Data Protection Regulation (GDPR) requirements:

  • 프로젝트 템플릿 확장 지점 및 개인 정보 및 쿠키 정책을 사용 하 여 대체할 수 있는 스텁된 태그를 포함 합니다.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • 합니다 Pages/Privacy.cshtml 페이지 또는 Views/Home/Privacy.cshtml 보기 사이트의 개인 정보 취급 방침에 자세히 설명 하는 페이지를 제공 합니다.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy.

기능을 사용 하도록 기본 쿠키 동의 ASP.NET Core 3.0 템플릿 생성 된 앱에서 ASP.NET Core 2.2 템플릿을 참조 하십시오.To enable the default cookie consent feature like that found in the ASP.NET Core 2.2 templates in an ASP.NET Core 3.0 template generated app:

  • 추가 CookiePolicyOptions 너무 Startup.ConfigureServices 하 고 UseCookiePolicyStartup.Configure:Add CookiePolicyOptions too Startup.ConfigureServices and UseCookiePolicy to Startup.Configure:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential 
                // cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                // requires using Microsoft.AspNetCore.Http;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
    
            services.AddRazorPages();
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }
    
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
    
            app.UseRouting();
    
            app.UseAuthorization();
    
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }
    }
    
  • 쿠키 동의 부분에 추가 합니다 _Layout.cshtml 파일:Add the cookie consent partial to the _Layout.cshtml file:

            @*Previous markup removed for brevity*@
        </header>
        <div class="container">
            <partial name="_CookieConsentPartial" />
            <main role="main" class="pb-3">
                @RenderBody()
            </main>
        </div>
    
        <footer class="border-top footer text-muted">
            <div class="container">
                &copy; 2019 - RPCC - <a asp-area="" asp-page="/Privacy">Privacy</a>
            </div>
        </footer>
    
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    
        @RenderSection("Scripts", required: false)
    </body>
    </html>
    
    
  • 추가 된 _CookieConsentPartial.cshtml 파일을 프로젝트:Add the _CookieConsentPartial.cshtml file to the project:

    @using Microsoft.AspNetCore.Http.Features
    
    @{
        var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
        var showBanner = !consentFeature?.CanTrack ?? false;
        var cookieString = consentFeature?.CreateConsentCookie();
    }
    
    @if (showBanner)
    {
        <div id="cookieConsent" class="alert alert-info alert-dismissible fade show" role="alert">
            Use this space to summarize your privacy and cookie use policy. <a asp-page="/Privacy">Learn More</a>.
            <button type="button" class="accept-policy close" data-dismiss="alert" aria-label="Close" data-cookie-string="@cookieString">
                <span aria-hidden="true">Accept</span>
            </button>
        </div>
        <script>
            (function () {
                var button = document.querySelector("#cookieConsent button[data-cookie-string]");
                button.addEventListener("click", function (event) {
                    document.cookie = button.dataset.cookieString;
                }, false);
            })();
        </script>
    }
    
  • 쿠키 동의 기능에 대해 알아보려면이 문서의 ASP.NET Core 2.2 버전을 선택 합니다.Select the ASP.NET Core 2.2 version of this article to read about the cookie consent feature.

  • 프로젝트 템플릿 확장 지점 및 개인 정보 및 쿠키 정책을 사용 하 여 대체할 수 있는 스텁된 태그를 포함 합니다.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • 쿠키 동의 기능 수 있습니다 동의 묻는 메시지가 표시 (및 추적) 사용자의 개인 정보를 저장 합니다.A cookie consent feature allows you to ask for (and track) consent from your users for storing personal information. 앱에 사용자 데이터 수집에 동의 하지 않은 경우 CheckConsentNeededtrue에 필수적이 지 않은 쿠키는 브라우저에 전송 되지 않습니다.If a user hasn't consented to data collection and the app has CheckConsentNeeded set to true, non-essential cookies aren't sent to the browser.
  • 기본적인 쿠키를 표시할 수 있습니다.Cookies can be marked as essential. 추적을 사용할 수 없습니다 및 사용자 동의 하지 않은 경우에 필수 쿠키는 브라우저에 전송 됩니다.Essential cookies are sent to the browser even when the user hasn't consented and tracking is disabled.
  • TempData 및 세션 쿠키 추적 비활성화 되 면 작동 되지 않습니다.TempData and Session cookies aren't functional when tracking is disabled.
  • 합니다 Identity 관리 페이지를 다운로드 하 여 사용자 데이터를 삭제 한 링크를 제공 합니다.The Identity manage page provides a link to download and delete user data.

합니다 샘플 앱 GDPR 확장 지점 중 대부분을 테스트 하 고 Api ASP.NET Core 2.1 템플릿을 추가할 수 있습니다.The sample app allows you test most of the GDPR extension points and APIs added to the ASP.NET Core 2.1 templates. 참조를 ReadMe 지침을 테스트 하는 것에 대 한 파일입니다.See the ReadMe file for testing instructions.

예제 코드 살펴보기 및 다운로드 (다운로드 방법)View or download sample code (how to download)

템플릿에서 생성 된 코드에서 ASP.NET Core GDPR 지원ASP.NET Core GDPR support in template-generated code

Razor 페이지 및 MVC 프로젝트 템플릿을 사용 하 여 만든 프로젝트에는 다음 GDPR 지원을 포함 합니다.Razor Pages and MVC projects created with the project templates include the following GDPR support:

  • CookiePolicyOptions 하 고 UseCookiePolicy 에서 설정 됩니다는 Startup 클래스입니다.CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • 합니다 _CookieConsentPartial.cshtml 부분 뷰합니다.The _CookieConsentPartial.cshtml partial view. Accept 단추는이 파일에 포함 됩니다.An Accept button is included in this file. 클릭할 때 합니다 Accept 단추, 쿠키를 저장 하는 동의 제공 됩니다.When the user clicks the Accept button, consent to store cookies is provided.
  • 합니다 Pages/Privacy.cshtml 페이지 또는 Views/Home/Privacy.cshtml 보기 사이트의 개인 정보 취급 방침에 자세히 설명 하는 페이지를 제공 합니다.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy. 합니다 _CookieConsentPartial.cshtml 파일 개인 정보 페이지에 대 한 링크를 생성 합니다.The _CookieConsentPartial.cshtml file generates a link to the Privacy page.
  • 개별 사용자 계정을 사용 하 여 만든 앱에 대 한 관리 페이지는 다운로드 및 삭제에 대 한 링크를 제공 개인 사용자 데이터입니다.For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions 및 UseCookiePolicyCookiePolicyOptions and UseCookiePolicy

CookiePolicyOptions 초기화 됩니다 Startup.ConfigureServices:CookiePolicyOptions are initialized in Startup.ConfigureServices:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services 
    // to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies 
            // is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

        // If the app uses session state, call AddSession.
        // services.AddSession();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the 
    // HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        // If the app uses session state, call Session Middleware after Cookie 
        // Policy Middleware and before MVC Middleware.
        // app.UseSession();

        app.UseMvc();
    }
}

UseCookiePolicy 라고 Startup.Configure:UseCookiePolicy is called in Startup.Configure:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services 
    // to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies 
            // is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

        // If the app uses session state, call AddSession.
        // services.AddSession();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the 
    // HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        // If the app uses session state, call Session Middleware after Cookie 
        // Policy Middleware and before MVC Middleware.
        // app.UseSession();

        app.UseMvc();
    }
}

_CookieConsentPartial.cshtml 부분 뷰_CookieConsentPartial.cshtml partial view

합니다 _CookieConsentPartial.cshtml 부분 뷰:The _CookieConsentPartial.cshtml partial view:

@using Microsoft.AspNetCore.Http.Features

@{
    var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
    var showBanner = !consentFeature?.CanTrack ?? false;
    var cookieString = consentFeature?.CreateConsentCookie();
}

@if (showBanner)
{
    <nav id="cookieConsent" class="navbar navbar-default navbar-fixed-top" role="alert">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#cookieConsent .navbar-collapse">
                    <span class="sr-only">Toggle cookie consent banner</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <span class="navbar-brand"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></span>
            </div>
            <div class="collapse navbar-collapse">
                <p class="navbar-text">
                    Use this space to summarize your privacy and cookie use policy.
                </p>
                <div class="navbar-right">
                    <a asp-page="/Privacy" class="btn btn-info navbar-btn">Learn More</a>
                    <button type="button" class="btn btn-default navbar-btn" data-cookie-string="@cookieString">Accept</button>
                </div>
            </div>
        </div>
    </nav>
    <script>
        (function () {
            document.querySelector("#cookieConsent button[data-cookie-string]").addEventListener("click", function (el) {
                document.cookie = el.target.dataset.cookieString;
                document.querySelector("#cookieConsent").classList.add("hidden");
            }, false);
        })();
    </script>
}

이 부분:This partial:

  • 사용자에 대 한 추적의 상태를 가져옵니다.Obtains the state of tracking for the user. 앱을 동의 요구 하도록 구성 된 경우 사용자는 쿠키를 추적할 수 전에 동의 해야 합니다.If the app is configured to require consent, the user must consent before cookies can be tracked. 위쪽 탐색 모음에서 만든 쿠키 동의 패널 고정 됩니다. 동의 필요한 경우는 _Layout.cshtml 파일입니다.If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • HTML 제공 <p> 정책을 사용 하 여 개인 정보 및 쿠키를 요약 하는 요소입니다.Provides an HTML <p> element to summarize your privacy and cookie use policy.
  • 개인 정보 페이지 또는 사이트의 개인 정보 취급 방침을 자세히 설명 하 수 있는 보기에 대 한 링크를 제공 합니다.Provides a link to Privacy page or view where you can detail your site's privacy policy.

필수 쿠키Essential cookies

경우 동의 쿠키를 저장할 답변이 제공, 필수로 표시 하는 쿠키가 브라우저에 전달 됩니다.If consent to store cookies hasn't been provided, only cookies marked essential are sent to the browser. 다음 코드에서는 쿠키 중요 합니다.The following code makes a cookie essential:

public IActionResult OnPostCreateEssentialAsync()
{
    HttpContext.Response.Cookies.Append(Constants.EssentialSec, 
        DateTime.Now.Second.ToString(), 
        new CookieOptions() { IsEssential = true });

    ResponseCookies = Response.Headers[HeaderNames.SetCookie].ToString();

    return RedirectToPage("./Index");
}

TempData 공급자 및 세션 상태 쿠키 없는 필수TempData provider and session state cookies aren't essential

합니다 TempData 공급자 쿠키는 중요 하지 않습니다.The TempData provider cookie isn't essential. 추적을 해제 하면 TempData 공급자 작동 하지 않습니다.If tracking is disabled, the TempData provider isn't functional. 표시의 필수 요소로 TempData 쿠키 TempData 공급자를 추적 비활성화 되 면 사용 하려면 Startup.ConfigureServices:To enable the TempData provider when tracking is disabled, mark the TempData cookie as essential in Startup.ConfigureServices:

// The TempData provider cookie is not essential. Make it essential
// so TempData is functional when tracking is disabled.
services.Configure<CookieTempDataProviderOptions>(options => {
    options.Cookie.IsEssential = true;
});

세션 상태 쿠키 필수 요소는 아닙니다.Session state cookies are not essential. 추적을 사용할 수 없습니다. 세션 상태를 작동 하지 않습니다.Session state isn't functional when tracking is disabled. 다음 코드는 필수 세션 쿠키를 사용 하면:The following code makes session cookies essential:

services.AddSession(options =>
{
    options.Cookie.IsEssential = true;
});

개인 데이터Personal data

개별 사용자 계정을 사용 하 여 만든 ASP.NET Core 앱 코드를 다운로드 하 여 개인 데이터 삭제를 포함 합니다.ASP.NET Core apps created with individual user accounts include code to download and delete personal data.

사용자 이름을 선택 하 고 선택한 개인 데이터:Select the user name and then select Personal data:

개인 데이터 페이지 관리

메모:Notes:

  • 생성 하는 Account/Manage 코드를 참조 하십시오 스 캐 폴드 Identity합니다.To generate the Account/Manage code, see Scaffold Identity.
  • 합니다 삭제 하 고 다운로드 링크는 기본 id 데이터에만 작동 합니다.The Delete and Download links only act on the default identity data. 앱 사용자 지정 사용자 데이터를 만든 사용자 지정 사용자 데이터를 다운로드/삭제를 확장 해야 합니다.Apps that create custom user data must be extended to delete/download the custom user data. 자세한 내용은 추가, 다운로드 및 삭제 사용자 지정 사용자 데이터 Id로합니다.For more information, see Add, download, and delete custom user data to Identity.
  • Id 데이터베이스 테이블에 저장 된 사용자에 대 한 토큰을 저장 AspNetUserTokens 사용자로 인해 연계 delete 동작을 통해 삭제 될 때 삭제 되는 외래 키합니다.Saved tokens for the user that are stored in the Identity database table AspNetUserTokens are deleted when the user is deleted via the cascading delete behavior due to the foreign key.
  • 외부 공급자 인증Facebook과 Google을 사용할 수 없는 쿠키 정책 수락 되기 전에 같이 합니다.External provider authentication, such as Facebook and Google, isn't available before the cookie policy is accepted.

휴지 상태의 암호화Encryption at rest

일부 데이터베이스 및 저장소 메커니즘에는 휴지 상태의 암호화에 대 한 허용합니다.Some databases and storage mechanisms allow for encryption at rest. 미사용 데이터 암호화:Encryption at rest:

  • 저장 된 데이터를 자동으로 암호화합니다.Encrypts stored data automatically.
  • 구성, 프로그래밍, 또는 데이터에 액세스 하는 소프트웨어에 대 한 다른 작업 없이 암호화 합니다.Encrypts without configuration, programming, or other work for the software that accesses the data.
  • 쉽고 안전한 옵션이입니다.Is the easiest and safest option.
  • 키 및 암호화를 관리 하기 위해 데이터베이스를 허용 합니다.Allows the database to manage keys and encryption.

예를 들어:For example:

기본 제공 미사용 데이터 암호화를 제공 하지 않는 데이터베이스에 대 한 디스크 암호화는 동일한 보호를 제공 하는 데 수 있습니다.For databases that don't provide built-in encryption at rest, you may be able to use disk encryption to provide the same protection. 예를 들어:For example:

추가 자료Additional resources