다음을 통해 공유


개발 중에 애플리케이션 비밀을 안전하게 저장

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처인 eBook에서 발췌한 내용입니다.

컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로서비스 아키텍처 eBook의 표지 썸네일.

보호된 리소스 및 기타 서비스와 연결하려면 ASP.NET Core 애플리케이션은 일반적으로 중요한 정보를 포함하는 연결 문자열, 암호 또는 기타 자격 증명을 사용해야 합니다. 이러한 중요한 정보는 비밀로 불립니다. 소스 코드에 비밀을 포함하지 않고 소스 제어에 비밀을 저장하지 않도록 하는 것이 가장 좋습니다. 대신 ASP.NET Core 구성 모델을 사용하여 더 안전한 위치에서 비밀을 읽어야 합니다.

개발 및 스테이징 리소스에 액세스하기 위한 비밀을 프로덕션 리소스에 액세스하는 데 사용되는 비밀과 구분해야 합니다. 다른 개인이 서로 다른 비밀 집합에 액세스해야 하기 때문입니다. 개발 중에 사용되는 비밀을 저장하기 위해 일반적인 방법은 환경 변수에 비밀을 저장하거나 ASP.NET Core Secret Manager 도구를 사용하는 것입니다. 프로덕션 환경에서 더 안전한 스토리지를 위해 마이크로 서비스는 Azure Key Vault에 비밀을 저장할 수 있습니다.

환경 변수에 비밀 저장

소스 코드에서 비밀을 유지하는 한 가지 방법은 개발자가 개발 머신에서 환경 변수로 문자열 기반 비밀을 설정하는 것입니다. 환경 변수를 사용하여 구성 섹션에 중첩된 것과 같은 계층적 이름으로 비밀을 저장하는 경우 콜론(:))으로 구분된 해당 섹션의 전체 계층 구조를 포함하도록 변수의 이름을 지정해야 합니다.

예를 들어 환경 변수 Logging:LogLevel:DefaultDebug 값으로 설정하는 것은 다음 JSON 파일의 구성 값과 동일합니다.

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

환경 변수에서 이러한 값에 액세스하기 위해서는 애플리케이션이 AddEnvironmentVariables 개체를 생성할 때 ConfigurationBuilder에서 IConfigurationRoot를 호출하기만 하면 됩니다.

메모

환경 변수는 일반적으로 일반 텍스트로 저장되므로 환경 변수를 사용하는 컴퓨터 또는 프로세스가 손상되면 환경 변수 값이 표시됩니다.

ASP.NET Core Secret Manager를 사용하여 비밀 저장

ASP.NET Core Secret Manager 도구는 개발 동안소스 코드에서 비밀을 유지하는 또 다른 방법을 제공합니다. Secret Manager 도구를 사용하려면 프로젝트 파일에 Microsoft.Extensions.Configuration.UserSecrets 패키지를 설치합니다. 해당 종속성이 존재하고 복원되면 dotnet user-secrets 명령을 사용하여 명령줄에서 비밀 값을 설정할 수 있습니다. 이러한 비밀은 소스 코드에서 벗어나 사용자의 프로필 디렉터리(세부 정보는 OS에 따라 다름)의 JSON 파일에 저장됩니다.

비밀 관리자 도구에서 설정한 비밀은 비밀을 사용하는 프로젝트의 UserSecretsId 속성으로 구성됩니다. 따라서 아래 코드 조각과 같이 프로젝트 파일에서 UserSecretsId 속성을 설정해야 합니다. 기본값은 Visual Studio에서 할당한 GUID이지만 실제 문자열은 컴퓨터에서 고유하기만 하면 중요하지 않습니다.

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

애플리케이션에서 Secret Manager와 함께 저장된 비밀은 AddUserSecrets<T> 인스턴스에서 ConfigurationBuilder 호출하여 구성에 애플리케이션에 대한 비밀을 포함함으로써 수행됩니다. 제네릭 매개 변수 T UserSecretId가 적용된 어셈블리의 형식이어야 합니다. 일반적으로 AddUserSecrets<Startup> 사용하는 것은 괜찮습니다.

AddUserSecrets<Startup>() CreateDefaultBuilder 메서드를 사용할 때 개발 환경의 기본 옵션에 포함됩니다.