데이터 보호: 용도 문자열
- 본 번역문서의 원문은 Purpose Strings docs.microsoft.com 입니다.
- 본 번역문서는 ASP.NET Core 데이터 보호 : 소비자 API 용도 문자열 www.taeyo.net 에서도 함께 제공됩니다.
IDataProtectionProvider를 소비하는 구성 요소는 CreateProtector 메서드를 호출할 때 반드시 고유한 용도(Purpose) 매개변수를 전달해야 합니다. 이 용도 매개변수는 데이터 보호 시스템의 보안에 내재되어 루트 암호화 키가 동일한 경우에도 암호화 소비자들 간에 격리를 제공해줍니다.
소비자가 용도를 지정하면, 루트 암호화 키와 용도 문자열이 함께 적용되어 해당 소비자에 대한 고유한 하위 암호화 키가 파생됩니다. 이로 인해서 해당 소비자와 응용 프로그램 내의 모든 다른 암호화 소비자들이 서로 격리되며, 해당 소비자의 페이로드를 다른 구성 요소들이 읽을 수도, 다른 구성 요소들의 페이로드를 해당 소비자가 읽을 수도 없게 됩니다. 결과적으로 이런 격리 때문에 구성 요소에 대한 전체 범주의 공격도 불가능해집니다.
이 다이어그램에서 IDataProtector의 인스턴스 A 및 B는 서로 상대방의 페이로드를 읽을 수 없으며, 자신의 페이로드만 읽을 수 있습니다.
그러나 용도 문자열 자체가 보안 대상인 것은 아닙니다. 정상적으로 동작하는 다른 구성 요소가 사용하는 용도 문자열과 중복되지 않는 유일한 문자열을 지정하기만 하면 됩니다.
팁
경험에 비춰볼 때, 데이터 보호 API를 소비하는 구성 요소의 네임스페이스와 형식 이름을 조합해서 사용하는 것도 좋은 방법입니다. 이 정보는 사실상 중복되지 않기 때문입니다.
가령, 전달자 토큰의 발급을 담당하는 Contoso 프로젝트의 구성 요소는 용도 문자열로 Contoso.Security.BearerToken 을 사용할 수 있습니다. 혹은 더 개선된 방법으로 Contoso.Security.BearerToken.v1 을 용도 문자열로 사용할 수도 있습니다. 이런 식으로 버전 번호를 추가해 놓으면 이후 버전에서는 용도 문자열로 Contoso.Security.BearerToken.v2 등과 같이 사용할 수 있으므로, 페이로드에 관한 한 버전 간에 서로 완벽한 격리를 제공할 수 있습니다.
CreateProtector 메서드의 용도 매개변수는 문자열 배열 형식이기 때문에, 위의 매개변수는 대신 [ "Contoso.Security.BearerToken", "v1" ]과 같이 지정할 수도 있습니다. 따라서, 이를 활용하면 용도의 계층적 구조를 구성할 수 있으며 데이터 보호 시스템을 사용하는 다중 테넌트(Multi-Tenancy) 시나리오를 고려해 볼 수 있는 여지를 남겨줍니다.
주의
신뢰할 수 없는 사용자의 입력이 구성 요소의 유일한 용도 체인 입력 원본이 될 수 있도록 허용해서는 안됩니다.
예를 들어서, 보안 메시지의 저장을 담당하는 Contoso.Messaging.SecureMessage라는 구성 요소가 존재한다고 가정해보겠습니다. 만약, 이 구성 요소가 CreateProtector([ 사용자 이름 ])과 같은 형태로 메서드를 호출하도록 작성되어 있다면, 악의적인 사용자가 사용자 계정을 "Contoso.Security.BearerToken"이라는 이름으로 생성해서 CreateProtector([ "Contoso.Security.BearerToken" ])과 같이 메서드를 호출하는 구성 요소를 얻으려고 시도할 수 있으며, 이는 의도하지 않게 인증 토큰으로 인식할 수도 있는 페이로드를 보안 메시징 시스템이 발급할 수도 있는 결과를 초래하게 됩니다.
이 메시징 구성 요소에 적합한 용도 체인은, 적절한 격리를 제공할 수 있는 CreateProtector([ "Contoso.Messaging.SecureMessage", "User: username" ]) 입니다.
IDataProtectionProvider, IDataProtector, 및 용도에 의해서 제공되는 격리 및 동작은 다음과 같습니다:
-
특정 IDataProtectionProvider 개체의 CreateProtector 메서드는 IDataProtector 개체를 생성하는 IDataProtectionProvider 개체와 메서드에 전달된 용도 매개변수 양쪽 모두와 고유하게 연결된 IDataProtector 개체를 생성합니다.
-
용도 매개변수에 null을 지정할 수 없습니다. 용도를 배열로 지정할 경우에는 배열의 길이가 0이 될 수 없으며 배열의 모든 요소들은 null이 아니어야 합니다. 기술적으로 용도에 빈 문자열을 지정할 수는 있지만 권장하지는 않습니다.
-
두 개로 요소로 구성된 용도 인자들은 동일한 문자열이 동일한 순서로 담겨진 경우에만 같은 것으로 간주됩니다 (서수 비교자가 사용됩니다). 단일 용도 문자열 인자의 경우, 해당 인자를 담고 있는 단일 요소 용도 배열과 동일합니다.
-
두 개의 IDataProtector 개체는 동일한 용도 매개변수를 이용해서 동일한 IDataProtectionProvider 개체로부터 생성된 경우에만 동일한 것으로 간주됩니다.
-
특정 IDataProtector 개체에서 Unprotect(protectedData)를 호출할 경우, 동일한 IDataProtector 개체에서 "protectedData := Protect(unprotectedData)" 인 경우에만 보호 해제된 원본 데이터가 반환됩니다.
노트
본문에서는 일부 구성 요소가 다른 구성 요소와 동일한 용도 문자열을 의도적으로 선택하는 경우는 감안하지 않습니다. 기본적으로 이런 구성 요소들은 악의적인 구성 요소로 간주되며, 데이터 보호 시스템은 이미 악의적인 코드가 작업자 프로세스 내부에서 실행 중인 경우까지 보안을 보장하지 않습니다.
- 권한부여: 개요 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