데이터 보호: 비-DI 인식 시나리오
- 본 번역문서의 원문은 Non DI aware scenarios docs.microsoft.com 입니다.
데이터 보호 시스템은 일반적으로 서비스 컨테이너에 추가되어 DI 메커니즘을 통해서 종속 구성 요소에 제공되도록 설계되었습니다. 그러나 경우에 따라서는 이런 구성이 불가능한 경우도 있으며, 그 대표적인 사례가 기존 응용 프로그램에 데이터 보호 시스템을 추가하는 경우입니다.
Microsoft.AspNetCore.DataProtection.Extensions 패키지는 이런 시나리오를 지원하기 위해서 DI 관련 코드 경로를 거치지 않고도 데이터 보호 시스템을 사용할 수 있도록 간편한 방법을 제공해주는 DataProtectionProvider 구체 형식을 제공합니다. 이 형식은 자체적으로 IDataProtectionProvider 인터페이스를 구현하고 있으며 생성하는 방법도 매우 쉬워서, 해당 공급자의 암호화 키를 저장할 위치를 가리키는 DirectoryInfo 개체를 전달하기만 하면 됩니다.
사용 예제:
using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
public class Program
{
public static void Main(string[] args)
{
// get the path to %LOCALAPPDATA%\myapp-keys
string destFolder = Path.Combine(
Environment.GetEnvironmentVariable("LOCALAPPDATA"),
"myapp-keys");
// instantiate the data protection system at this folder
var dataProtectionProvider = DataProtectionProvider.Create(
new DirectoryInfo(destFolder));
var protector = dataProtectionProvider.CreateProtector("Program.No-DI");
Console.Write("Enter input: ");
string input = Console.ReadLine();
// protect the payload
string protectedPayload = protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// unprotect the payload
string unprotectedPayload = protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
}
}
/*
* SAMPLE OUTPUT
*
* Enter input: Hello world!
* Protect returned: CfDJ8FWbAn6...ch3hAPm1NJA
* Unprotect returned: Hello world!
*/
주의
DataProtectionProvider 구체 형식은 기본적으로 원시 키 관련 자료를 파일 시스템에 저장하기 전에 암호화 하지 않습니다. 이는 개발자가 네트워크 공유를 지정하는 경우를 지원하기 위한 것으로, 그런 경우에는 데이터 보호 시스템이 적절한 저장된 비활성 키 암호화 메커니즘을 자동으로 추론할 수가 없습니다.
또한, 기본적으로 DataProtectionProvider 구체 형식은 응용 프로그램을 격리하지 않기 때문에, 동일한 키 디렉터리를 가리키는 모든 응용 프로그램들은 용도 매개변수가 일치하기만 하면 페이로드를 공유할 수 있습니다.
필요하다면 응용 프로그램 개발자가 이 문제점들을 모두 해결할 수 있습니다. DataProtectionProvider 구체 형식의 생성자에는 데이터 보호 시스템의 동작을 제어할 때 사용되는 선택적 구성 콜백을 전달할 수 있습니다. 다음 예제는 명시적으로 SetApplicationName 메서드를 호출해서 격리 기능을 활성화하고, 자동으로 Windows DPAPI를 이용해서 저장되는 키를 암호화하도록 시스템을 구성하는 방법을 보여줍니다. 만약 디렉터리가 UNC 공유를 가리키고 있다면, 관련된 모든 머신에 공유 인증서를 배포한 다음, ProtectKeysWithCertificate 메서드를 호출해서 시스템이 대신 인증서 기반 암호화를 사용하도록 구성할 수도 있습니다.
using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
public class Program
{
public static void Main(string[] args)
{
// get the path to %LOCALAPPDATA%\myapp-keys
string destFolder = Path.Combine(
Environment.GetEnvironmentVariable("LOCALAPPDATA"),
"myapp-keys");
// instantiate the data protection system at this folder
var dataProtectionProvider = DataProtectionProvider.Create(
new DirectoryInfo(destFolder),
configuration =>
{
configuration.SetApplicationName("my app name");
configuration.ProtectKeysWithDpapi();
});
var protector = dataProtectionProvider.CreateProtector("Program.No-DI");
Console.Write("Enter input: ");
string input = Console.ReadLine();
// protect the payload
string protectedPayload = protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// unprotect the payload
string unprotectedPayload = protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
}
}
팁
DataProtectionProvider 구체 형식 생성은 비용이 많이 드는 작업입니다. 만약, 응용 프로그램이 이 형식의 인스턴스를 여러 개 관리하지만 모든 인스턴스가 동일한 키 저장소 디렉터리를 가리킨다면 응용 프로그램의 성능이 저하될 수 있습니다. 권장되는 사용 방식은 응용 프로그램 개발자가 이 형식의 인스턴스를 한 번만 생성한 다음, 해당 단일 참조를 가능한 여러 번 재사용하는 것입니다. DataProtectionProvider 형식과 이 형식으로부터 생성된 모든 IDataProtector의 인스턴스는 다중 호출자에 대해 스레드로부터 안전(Thread-Safe)합니다.
- 권한부여: 개요 2017-01-14 08:00
- 권한부여: 간단한 권한부여 2017-01-14 11:00
- 권한부여: 역할 기반 권한부여 2017-01-14 14:00
- 권한부여: 클레임 기반 권한부여 2017-01-15 08:00
- 권한부여: 사용자 지정 정책 기반 권한부여 2017-01-15 11:00
- 권한부여: 요구사항 처리기와 의존성 주입 2017-01-15 14:00
- 권한부여: 리소스 기반 권한부여 2017-01-16 08:00
- 권한부여: 뷰 기반 권한부여 2017-01-16 11:00
- 권한부여: 스키마별 신원 제한 2017-01-16 14:00
- 인증: ASP.NET Core Identity 살펴보기 2017-01-30 08:00
- 인증: Facebook, Google 및 기타 외부 공급자를 이용한 인증 활성화시키기 2017-02-13 08:00
- 인증: Facebook 인증 구성하기 2017-02-13 11:00
- 인증: Twitter 인증 구성하기 2017-02-20 08:00
- 인증: Google 인증 구성하기 2017-02-20 11:00
- 인증: Microsoft 계정 인증 구성하기 2017-02-20 14:00
- 인증: 계정 확인 및 비밀번호 복구 2017-03-06 08:00
- 인증: SMS를 이용한 2단계 인증 2017-03-13 08:00
- 인증: ASP.NET Core Identity 없이 Cookie 미들웨어 사용하기 2017-03-20 08:00
- 데이터 보호: 데이터 보호 개요 2017-03-27 08:00
- 데이터 보호: 데이터 보호 API 시작하기 2017-03-29 08:00
- 데이터 보호: 소비자 APIs 개요 2017-03-31 08:00
- 데이터 보호: 용도 문자열 2017-04-03 08:00
- 데이터 보호: ASP.NET Core의 용도 계층 구조 및 다중-테넌트(Multi-Tenancy) 2017-04-05 08:00
- 데이터 보호: 비밀번호 해싱 2017-04-07 08:00
- 데이터 보호: 보호된 페이로드의 수명 제한하기 2017-04-10 08:00
- 테이터 보호: 키가 취소된 페이로드의 보호 해제하기 2017-04-12 08:00
- 데이터 보호: 데이터 보호 구성하기 2017-04-14 08:00
- 데이터 보호: 키 관리 및 수명 기본 설정 2017-04-17 08:00
- 데이터 보호: 머신 수준 정책 2017-04-19 08:00
- 데이터 보호: 비-DI 인식 시나리오 2017-04-21 08:00
- 호환성: 응용 프로그램 간 인증 쿠키 공유하기 2017-05-12 08:00
- 호환성: ASP.NET의 <machineKey> 요소 대체하기 2017-05-16 08:00
- 교차 원본 요청 활성화시키기 (CORS) 2017-05-17 08:00
- ASP.NET Core 응용 프로그램에 SSL 적용하기 2017-05-18 08:00
- 개발 중 민감한 응용 프로그램 정보 안전하게 저장하기 2017-05-19 08:00