ASP.NET Core의 GDPR(EU 일반 데이터 보호 규정) 지원

작성자: Rick Anderson

ASP.NET Core는 GDPR(EU 일반 데이터 보호 규정) 요구 사항 중 일부를 충족하는 데 도움이 되는 API 및 템플릿을 제공합니다.

  • 프로젝트 템플릿에는 개인 정보 보호 및 사용 정책으로 바꿀 수 있는 확장 지점 및 스텁 태그가 cookie 포함됩니다.
  • Pages/ Privacy .cshtml 페이지 또는 Views/ Home / Privacy .cshtml 보기는 사이트의 개인 정보 취급 방침을 자세히 설명하는 페이지를 제공합니다.

ASP.NET Core cookie 3.0 템플릿 생성 앱의 ASP.NET Core 2.2 템플릿에 있는 것과 같은 기본 동의 기능을 사용하도록 설정하려면 다음을 수행합니다.

  • using 지시문 목록에 를 using Microsoft.AspNetCore.Http 추가합니다.

  • Cookie 에 PolicyOptions를 Startup.ConfigureServices 추가하고 에 Cookie 정책을 사용합니다. 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();
            });
        }
    }
    
  • 동의 cookie 일부를 _Layout.cshtml 파일에 추가합니다.

            @*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>
    
    
  • _ Cookie ConsentPartial.cshtml 파일을 프로젝트에 추가합니다.

    @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 버전을 선택하여 동의 기능에 대해 읽어보십시오. cookie

  • 프로젝트 템플릿에는 개인 정보 보호 및 사용 정책으로 바꿀 수 있는 확장 지점 및 스텁 태그가 cookie 포함됩니다.
  • cookie동의 기능을 사용하면 개인 정보를 저장하기 위해 사용자의 동의를 요청(및 추적)할 수 있습니다. 사용자가 데이터 수집에 동의하지 않았고 앱에 CheckConsentNeeded가 로 설정된 경우 true cookie 필수가 아닌 가 브라우저로 전송되지 않습니다.
  • Cookies는 필수로 표시될 수 있습니다. 사용자가 cookie 동의하지 않았고 추적을 사용하지 않도록 설정하더라도 필수 가 브라우저로 전송됩니다.
  • 추적을 사용하지 않도록 설정하면 TempData cookie 및 세션이 작동하지 않습니다.
  • Identity 관리 페이지에서는 사용자 데이터를 다운로드하고 삭제할 수 있는 링크를 제공합니다.

샘플 앱을 사용하면 ASP.NET Core 2.1 템플릿에 추가된 대부분의 GDPR 확장 지점 및 API를 테스트할 수 있습니다. 테스트 지침은 추가 정보 파일을 참조 하세요.

예제 코드 살펴보기 및 다운로드 (다운로드 방법)

템플릿 생성 코드에서 GDPR 지원 ASP.NET Core

Razor 프로젝트 템플릿을 사용 하 여 만든 페이지 및 MVC 프로젝트에는 다음과 같은 GDPR 지원이 포함 됩니다.

  • Cookie PolicyoptionsUse Cookie Policy 는 클래스에 설정 되어 있습니다 Startup .
  • _ Cookie ConsentPartial 부분 뷰입니다. 수락 단추가이 파일에 포함 됩니다. 사용자가 동의 단추를 클릭 하면 저장소에 대 한 동의가 cookie 제공 됩니다.
  • Pages/ Privacy cshtml 페이지 또는 Views/ Home / Privacy cshtml 보기는 사이트의 개인 정보 취급 방침에 대 한 세부 정보를 제공 하는 페이지를 제공 합니다. _ Cookie ConsentPartial 파일은 페이지에 대 한 링크를 생성 합니다 Privacy .
  • 개별 사용자 계정을 사용 하 여 만든 앱의 경우 관리 페이지에 개인 사용자 데이터를 다운로드 하 고 삭제할 수 있는 링크가 제공 됩니다.

CookiePolicyOptions 및 사용 Cookie 정책

Cookie Policyoptions 는에서 초기화 됩니다 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();
    }
}

사용 Cookie 정책은 에서 호출 됩니다 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 부분 보기

_ Cookie ConsentPartial 부분 보기:

@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>
}

이 부분:

  • 사용자에 대 한 추적 상태를 가져옵니다. 앱이 동의를 요구 하도록 구성 된 경우 사용자는를 추적할 수 있도록 먼저 동의 해야 합니다 cookie . 동의가 필요한 경우에는 cookie _ Layout 파일에 의해 생성 된 탐색 모음 위에서 승인 패널을 고정 합니다.
  • <p>개인 정보를 요약 하 고 정책을 사용 하는 HTML 요소를 제공 cookie 합니다.
  • 사이트의 개인 Privacy 정보 취급 방침을 자세히 설명할 수 있는 페이지 또는 보기에 대한 링크를 제공합니다.

필수 cookie s

저장에 대한 동의가 제공되지 않은 경우 cookie 필수로 표시된 만 cookie 브라우저로 전송됩니다. 다음 코드는 cookie 필수입니다.

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 공급자 및 세션 상태는 cookie 필수가 아닙니다.

TempData 공급자는 cookie 필수가 아닙니다. 추적을 사용하지 않도록 설정하면 TempData 공급자가 작동하지 않습니다. 추적을 사용하지 않도록 설정할 때 TempData 공급자를 사용하도록 설정하려면 에서 TempData를 cookie 필수로 표시합니다. 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;
});

세션 상태 cookie s는 필수가 아닙니다. 추적을 사용하지 않도록 설정하면 세션 상태가 작동하지 않습니다. 다음 코드는 세션을 cookie 필수로 만듭니다.

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

개인 데이터

ASP.NET 개별 사용자 계정으로 만든 Core 앱에는 개인 데이터를 다운로드하고 삭제하는 코드가 포함됩니다.

사용자 이름을 선택한 다음, 개인 데이터 를 선택합니다.

개인 데이터 관리 페이지

참고:

미사용 암호화

일부 데이터베이스 및 저장소 메커니즘은 미사용 암호화를 허용 합니다. 저장 데이터 암호화:

  • 저장 된 데이터를 자동으로 암호화 합니다.
  • 데이터에 액세스 하는 소프트웨어에 대해 구성, 프로그래밍 또는 기타 작업을 수행 하지 않고 암호화 합니다.
  • 는 가장 쉽고 안전한 옵션입니다.
  • 데이터베이스에서 키와 암호화를 관리할 수 있습니다.

예를 들어:

미사용 기본 암호화를 제공 하지 않는 데이터베이스의 경우 디스크 암호화를 사용 하 여 동일한 보호를 제공할 수 있습니다. 예를 들어:

추가 자료