데이터 보호: 소비자 APIs 개요
- 본 번역문서의 원문은 Consumer APIs overview docs.microsoft.com 입니다.
- 본 번역문서는 ASP.NET Core 데이터 보호 : 소비자 APIs 개요 www.taeyo.net 에서도 함께 제공됩니다.
IDataProtectionProvider 인터페이스와 IDataProtector 인터페이스는 소비자가 데이터 보호 시스템을 사용하기 위한 가장 기본이 되는 인터페이스들입니다. 이 인터페이스들은 Microsoft.AspNetCore.DataProtection.Abstractions 패키지에 위치해 있습니다.
IDataProtectionProvider
공급자 인터페이스는 데이터 보호 시스템의 루트를 나타냅니다. 그러나 이 인터페이스를 데이터 보호 및 보호 해제 작업에 직접 사용할 수는 없습니다. 그 대신, 소비자는 IDataProtectionProvider.CreateProtector("용도") 메서드를 호출해서 IDataProtector 인터페이스의 참조를 가져와야 하며, 여기서 "용도"는 사용 사례에 관한 소비자의 의도를 설명하는 문자열입니다. 이 매개변수의 의미와 적절한 값을 선택하는 요령에 대해서는 용도 문자열 문서를 참고하시기 바랍니다.
IDataProtector
보호자 인터페이스는 CreateProtector 메서드 호출에 의해서 반환되며 소비자가 보호 및 보호 해제 작업에 사용할 수 있는 인터페이스입니다.
데이터를 보호하려면 데이터를 Protect 메서드에 전달하기만 하면 됩니다. 기본 인터페이스는 byte[]을 byte[]로 변환하는 메서드를 정의하지만, 문자열을 문자열로 변환하는 오버로드 메서드도 (확장 메서드의 형태로) 제공됩니다. 두 메서드의 결과는 보안적으로 동일하므로 개발자는 자신의 상황에 가장 적합한 오버로드 버전을 선택하면 됩니다. 어떤 오버로드 메서드를 선택하던지 Protect 메서드에서 반환된 값은 보호되며 (암호화 및 변조 방지되며), 응용 프로그램은 신뢰할 수 없는 클라이언트로 이 값을 전송할 수 있습니다.
이미 보호된 데이터를 보호 해제하려면 보호된 데이터를 Unprotect 메서드에 전달하면 됩니다. (개발자의 편의를 위해서 byte[]을 byte[]로 변환하는 메서드와 문자열을 문자열로 변환하는 메서드가 모두 제공됩니다.) 동일한 IDataProtector 인스턴스의 Protect 메서드를 호출해서 생성된 보호된 페이로드는 Unprotect 메서드를 호출하면 보호 해제된 원본 페이로드가 반환됩니다. 그러나 보호된 페이로드가 변조됐거나 다른 IDataProtector 인스턴스에 의해서 만들어진 페이로드라면 Unprotect 메서드가 CryptographicException을 던집니다.
IDataProtector 인스턴스의 동일 여부를 판단하는 기준은 용도의 개념과 밀접한 관계를 갖고 있습니다. 비록 두 IDataProtector 인스턴스가 동일한 루트 IDataProtectionProvider로부터 생성되었더라도, IDataProtectionProvider.CreateProtector 메서드를 호출할 때 서로 다른 용도 문자열을 지정했다면, 두 인스턴스는 별개의 보호자로 간주되며, 서로 다른 인스턴스가 보호한 페이로드를 보호 해제하지 못합니다.
인터페이스 소비하기
DI-인식 구성 요소의 경우, 구성 요소의 생성자에서 IDataProtectionProvider 매개변수를 전달 받고, 구성 요소의 인스턴스가 만들어질 때 DI 시스템이 자동으로 서비스를 제공하는 방식으로 사용하도록 만들어졌습니다.
노트
일부 응용 프로그램은 (콘솔 응용 프로그램이나 ASP.NET 4.x 응용 프로그램 같은) DI를 인식하지 못하므로 본문에서 설명하는 메커니즘을 사용할 수 없습니다. 이런 시나리오를 위해서 DI를 거치지 않고 IDataProtectionProvider의 인스턴스를 가져오는 방법에 대한 자세한 정보는 비-DI 인식 시나리오 문서를 참고하시기 바랍니다.
다음 예제는 세 가지 개념을 보여주고 있습니다:
-
서비스 컨테이너에 데이터 보호 시스템 추가하기
-
DI를 통해서 IDataProtectionProvider의 인스턴스 가져오기
-
IDataProtectionProvider로부터 IDataProtector의 인스턴스를 생성하고, 이를 이용해서 데이터를 보호하고 보호 해제하기
using System;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
// add data protection services
var serviceCollection = new ServiceCollection();
serviceCollection.AddDataProtection();
var services = serviceCollection.BuildServiceProvider();
// create an instance of MyClass using the service provider
var instance = ActivatorUtilities.CreateInstance<MyClass>(services);
instance.RunSample();
}
public class MyClass
{
IDataProtector _protector;
// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("Contoso.MyClass.v1");
}
public void RunSample()
{
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: CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ
* Unprotect returned: Hello world!
*/
Microsoft.AspNetCore.DataProtection.Abstractions 패키지에는 개발자의 편의를 위한 IServiceProvider.GetDataProtector 확장 메서드가 포함되어 있습니다. 이 확장 메서드는 서비스 공급자에서 IDataProtectionProvider를 얻고 IDataProtectionProvider.CreateProtector 메서드를 호출하는 과정을 단일 작업으로 축약시켜줍니다. 다음 예제는 이 확장 메서드의 사용 방법을 보여줍니다.
using System;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
// add data protection services
var serviceCollection = new ServiceCollection();
serviceCollection.AddDataProtection();
var services = serviceCollection.BuildServiceProvider();
// get an IDataProtector from the IServiceProvider
var protector = services.GetDataProtector("Contoso.Example.v2");
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}");
}
}
팁
IDataProtectionProvider 인터페이스 및 IDataProtector 인터페이스의 인스턴스는 다중 호출자에 대해 스레드로부터 안전(Thread-Safe)합니다. 구성 요소에서 CreateProtector 메서드를 호출해서 IDataProtector 인터페이스 참조를 얻은 다음, 이 참조를 이용해서 Protect 메서드 및 Unprotect 메서드를 반복적으로 호출할 수 있도록 만들어졌습니다.
Unprotect 메서드 호출 시 보호된 페이로드를 검증하거나 판독하지 못하면 CryptographicException이 던져집니다. 일부 구성 요소에서는 보호 해제 작업 중 발생하는 예외를 무시해야 하는 경우도 있는데, 가령 인증 쿠키를 읽는 구성 요소는 요청 자체를 실패로 처리하는 대신 이 예외를 잡아서 처리함으로써 쿠키가 아예 존재하지 않는 것처럼 동작할 수 있습니다. 이런 동작이 필요한 구성 요소는 모든 예외를 감춰버리는 대신 명확하게 CryptographicException만 잡아야 합니다.
- 권한부여: 개요 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