ASP.NET Core의 데이터 보호 키 관리 및 수명Data Protection key management and lifetime in ASP.NET Core

작성자: Rick AndersonBy Rick Anderson

키 관리Key management

응용 프로그램은 자신이 실행되는 운영 환경을 감지해서 자체적으로 키 구성을 처리하려고 시도합니다.The app attempts to detect its operational environment and handle key configuration on its own.

  1. 앱에서 호스팅되는 경우 Azure 앱, 키에 유지 되는 %HOME%\ASP.NET\DataProtection-Keys 폴더입니다.If the app is hosted in Azure Apps, keys are persisted to the %HOME%\ASP.NET\DataProtection-Keys folder. 이 폴더는 네트워크 저장소에서 지원하고, 앱을 호스트하는 모든 컴퓨터에서 동기화됩니다.This folder is backed by network storage and is synchronized across all machines hosting the app.

    • 저장된 키는 보호되지 않습니다.Keys aren't protected at rest.
    • DataProtection-Keys 폴더는 단일 배포 슬롯에 위치한 응용 프로그램의 모든 인스턴스에 키 링을 제공합니다.The DataProtection-Keys folder supplies the key ring to all instances of an app in a single deployment slot.
    • 준비 및 프로덕션과 같은 별도의 배포 슬롯은 키 링을 공유하지 않습니다.Separate deployment slots, such as Staging and Production, don't share a key ring. 예를 들어 스테이징 및 프로덕션을 교환 또는 A를 사용 하 여 배포 슬롯 간에 교환할 때 / B 테스트, 데이터 보호를 사용 하 여 모든 앱은 이전 슬롯 내 키 링을 사용 하 여 저장 된 데이터를 해독할 수 없습니다.When you swap between deployment slots, for example swapping Staging to Production or using A/B testing, any app using Data Protection won't be able to decrypt stored data using the key ring inside the previous slot. 이렇게 하면 사용자 데이터 보호를 사용 하 여 쿠키를 보호 하기 위해 표준 Asp.net 쿠키 인증을 사용 하는 앱에서 기록 합니다.This leads to users being logged out of an app that uses the standard ASP.NET Core cookie authentication, as it uses Data Protection to protect its cookies. 슬롯에 관계 없는 키 링을 설치 하려는 경우 Azure Blob Storage, Azure Key Vault를 SQL 저장소 등의 외부 키 링 공급자를 사용 하거나 Redis 캐시 합니다.If you desire slot-independent key rings, use an external key ring provider, such as Azure Blob Storage, Azure Key Vault, a SQL store, or Redis cache.
  2. 사용자 프로필이 사용 가능한 경우에는 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 폴더에 키가 저장됩니다.If the user profile is available, keys are persisted to the %LOCALAPPDATA%\ASP.NET\DataProtection-Keys folder. 운영 체제가 Windows DPAPI를 사용 하 여 미사용 키 암호화 됩니다.If the operating system is Windows, the keys are encrypted at rest using DPAPI.

  3. 응용 프로그램이 IIS에서 호스트되는 경우에는 작업자 프로세스 계정에만 ACL로 허용된 HKLM 레지스트리 하위의 특수한 레지스트리 키에 키가 저장됩니다.If the app is hosted in IIS, keys are persisted to the HKLM registry in a special registry key that's ACLed only to the worker process account. 저장된 비활성 키는 DPAPI를 통해서 암호화됩니다.Keys are encrypted at rest using DPAPI.

  4. 지금까지 살펴본 모든 조건과 일치하지 않으면 현재 프로세스 외부에서는 키가 유지되지 않습니다.If none of these conditions match, keys aren't persisted outside of the current process. 따라서 프로세스가 종료되면 생성된 모든 키가 사라집니다.When the process shuts down, all generated keys are lost.

개발자는 언제나 모든 제어 권한을 갖고 있으며 키가 저장되는 방식과 위치를 재정의할 수 있습니다.The developer is always in full control and can override how and where keys are stored. 위의 처음 세 가지 옵션은 대부분의 앱과 유사한 방법에 대 한 적절 한 기본값을 제공 해야 ASP.NET <machineKey > 자동 생성 루틴 이전에 작동 합니다.The first three options above should provide good defaults for most apps similar to how the ASP.NET <machineKey> auto-generation routines worked in the past. 유일하게 마지막 대체 옵션만 키 지속성을 원할 경우 개발자가 사전 구성 작업을 수행해야 하는 시나리오지만, 이런 대체 시나리오는 매우 드물게 발생합니다.The final, fallback option is the only scenario that requires the developer to specify configuration upfront if they want key persistence, but this fallback only occurs in rare situations.

Docker 볼륨 (공유 볼륨 또는 컨테이너의 수명을 넘어 지속 되는 호스트에 탑재 된 볼륨)가 있는 폴더에 키를 유지 해야 경우 Docker 컨테이너에서 호스팅, 또는 외부 공급자와 같은 Azure Key Vault 또는 Redis합니다.When hosting in a Docker container, keys should be persisted in a folder that's a Docker volume (a shared volume or a host-mounted volume that persists beyond the container's lifetime) or in an external provider, such as Azure Key Vault or Redis. 앱 공유 네트워크 볼륨에 액세스할 수 없는 경우 외부 공급자로 웹 팜 시나리오에 유용한 이기도 (참조 PersistKeysToFileSystem 자세한).An external provider is also useful in web farm scenarios if apps can't access a shared network volume (see PersistKeysToFileSystem for more information).

경고

개발자가 기본 구성을 재정의해서 데이터 보호 시스템이 특정 키 저장소를 바라보도록 지정하면, 저장된 비활성 키의 자동 암호화가 비활성화됩니다.If the developer overrides the rules outlined above and points the Data Protection system at a specific key repository, automatic encryption of keys at rest is disabled. 저장된 비활성 키의 보호 기능은 구성을 통해서 다시 활성화시킬 수 있습니다.At-rest protection can be re-enabled via configuration.

키 수명Key lifetime

기본적으로 90 일 수명 동안을 보유 하는 키입니다.Keys have a 90-day lifetime by default. 키 만료 되 면 앱 자동으로 새 키를 생성 하 고 새 키를 활성 키로 설정 합니다.When a key expires, the app automatically generates a new key and sets the new key as the active key. 만료 된 키 시스템에 남아를 앱으로 보호 되는 모든 데이터를 해독할 수 있습니다.As long as retired keys remain on the system, your app can decrypt any data protected with them. 참조 키 관리 자세한 내용은 합니다.See key management for more information.

기본 알고리즘Default algorithms

기본 페이로드 보호 알고리즘 사용은 AES-256-CBC 기밀성 및 HMACSHA256에 대 한 신뢰성에 대 한 합니다.The default payload protection algorithm used is AES-256-CBC for confidentiality and HMACSHA256 for authenticity. 90 일 마다 변경 512 비트 마스터 키로 페이로드 당 단위로 이러한 알고리즘에 사용 되는 두 개의 하위 키 파생에 사용 됩니다.A 512-bit master key, changed every 90 days, is used to derive the two sub-keys used for these algorithms on a per-payload basis. 참조 파생 하위 키 자세한 내용은 합니다.See subkey derivation for more information.

추가 자료Additional resources