다음을 통해 공유


자습서: 관리 ID를 사용하여 비밀 없이 App Service에서 Azure 데이터베이스에 연결

App Service는 Azure에서 확장성 높은 자체 패치 웹 호스팅 서비스를 제공합니다. 또한 다음을 포함하여 Azure 데이터베이스에 대한 액세스를 보호하기 위한 턴키 솔루션인 앱에 대한 관리 ID를 제공합니다.

참고 항목

이 지침에는 Microsoft Entra 인증을 다르게 지원하는 Azure Cosmos DB에 대한 지침이 포함되어 있지 않습니다. 자세한 내용은 시스템 할당 관리 ID를 사용하여 Azure Cosmos DB 데이터에 액세스와 같은 Azure Cosmos DB 설명서를 참조하세요.

App Service의 관리 ID는 연결 문자열의 자격 증명과 같은 비밀을 앱에서 제거하여 앱의 보안을 보다 강화합니다. 이 자습서에서는 관리 ID를 사용하여 App Service에서 위에서 언급한 데이터베이스에 연결하는 방법을 보여 줍니다.

다음을 알아봅니다.

  • Microsoft Entra 사용자를 Azure 데이터베이스의 관리자 권한으로 구성합니다.
  • Microsoft Entra 사용자로 데이터베이스에 연결합니다.
  • App Service 앱에 대해 시스템 할당 또는 사용자 할당 관리 ID를 구성합니다.
  • 관리 ID에 대한 데이터베이스 액세스 권한을 부여합니다.
  • 관리 ID를 사용하여 코드(.NET Framework 4.8, .NET 6, Node.js, Python, Java)에서 Azure 데이터베이스에 연결합니다.
  • Microsoft Entra 사용자를 사용하여 개발 환경에서 Azure 데이터베이스에 연결합니다.

Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

필수 조건

  • .NET, Node.js, Python 또는 Java를 기반으로 App Service에서 앱을 만듭니다.
  • Azure SQL Database, Azure Database for MySQL 또는 Azure Database for PostgreSQL을 사용하여 데이터베이스 서버를 만듭니다.
  • 표준 연결 패턴(사용자 이름 및 암호 포함)에 익숙해야 하며 App Service 앱에서 선택한 데이터베이스에 성공적으로 연결할 수 있어야 합니다.

Azure CLI에 대한 환경을 준비합니다.

1. 서비스 커넥터 암호 없는 확장 설치

Azure CLI용 최신 서비스 커넥터 암호 없는 확장을 설치합니다.

az extension add --name serviceconnector-passwordless --upgrade

참고 항목

az version을 실행하여 확장 "serviceconnector-passwordless" 버전이 "2.0.2" 이상인지 확인하세요. 확장 버전을 업그레이드하려면 먼저 Azure CLI를 업그레이드해야 할 수 있습니다.

2. 암호 없는 연결 만들기

다음으로, 서비스 커넥터를 사용하여 암호 없는 연결을 만듭니다.

Azure Portal은 아래 명령을 작성하는 데 도움이 될 수 있습니다. Azure Portal에서 Azure App Service 리소스로 이동하고, 왼쪽 메뉴에서 서비스 커넥터를 선택하고, 만들기를 선택합니다. 필요한 모든 매개 변수로 양식을 작성합니다. Azure는 CLI에서 사용하거나 Azure Cloud Shell에서 실행하도록 복사할 수 있는 연결 만들기 명령을 자동으로 생성합니다.

다음 Azure CLI 명령은 --client-type 매개 변수를 사용합니다.

  1. 필요에 따라 az webapp connection create sql -h를 실행하여 지원되는 클라이언트 유형을 가져옵니다.

  2. 클라이언트 유형을 선택하고 해당 명령을 실행합니다. 다음 자리 표시자를 사용자 고유의 정보로 바꿉니다.

    az webapp connection create sql \
        --resource-group <group-name> \
        --name <server-name> \
        --target-resource-group <sql-group-name> \
        --server <sql-name> \
        --database <database-name> \
        --user-identity client-id=<client-id> subs-id=<subscription-id> \
        --client-type <client-type>
    

이 서비스 커넥터 명령은 백그라운드에서 다음 작업을 완료합니다.

  • 시스템 할당 관리 ID를 사용하도록 설정하거나 Azure App Service에서 호스트하는 앱 <server-name>의 사용자 ID를 할당합니다.
  • Microsoft Entra 관리자를 현재 로그인한 사용자로 설정합니다.
  • 시스템 할당 관리 ID 또는 사용자 할당 관리 ID에 대한 데이터베이스 사용자를 추가합니다. 이 사용자에게 데이터베이스 <database-name>의 모든 권한을 부여합니다. 사용자 이름은 이전 명령 출력의 연결 문자열에서 찾을 수 있습니다.
  • AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING 또는 AZURE_SQL_CONNECTIONSTRING이라는 구성을 데이터베이스 유형에 기반한 Azure 리소스로 설정합니다.
  • App Service의 경우 구성은 앱 설정 블레이드에서 설정됩니다.

연결을 만들 때 문제가 발생하면 문제 해결을 참조하세요.

3. 코드 수정

  1. 종속성을 설치합니다.

    dotnet add package Microsoft.Data.SqlClient
    
  2. 서비스 커넥터에서 추가한 환경 변수에서 Azure SQL Database 연결 문자열을 가져옵니다.

    using Microsoft.Data.SqlClient;
    
    // AZURE_SQL_CONNECTIONSTRING should be one of the following:
    // For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
    // For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
    
    string connectionString = 
        Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
    
    using var connection = new SqlConnection(connectionString);
    connection.Open();
    

    자세한 내용은 Active Directory 관리 ID 인증 사용을 참조하세요.

자세한 내용은 Microsoft SQL Server로의 클라이언트 프로그래밍 홈페이지를 참조하세요. 더 다양한 코드 샘플은 서비스 커넥터를 통해 데이터베이스 서비스에 대한 암호 없는 연결 만들기를 참조하세요.

4. 개발 환경 설정

이 샘플 코드는 DefaultAzureCredential을 사용하여 Microsoft Entra ID에서 Azure 데이터베이스에 사용할 수 있는 토큰을 가져온 다음 데이터베이스 연결에 추가합니다. DefaultAzureCredential을 사용자 지정할 수 있지만 기본적으로 다양합니다. 개발 환경에서 로컬로 실행하는지 App Service에서 실행하는지에 따라 로그인한 Microsoft Entra 사용자 또는 관리 ID에서 토큰을 가져옵니다.

추가 변경 없이 코드를 Azure에서 실행할 준비가 되었습니다. 그러나 로컬에서 코드를 디버그하려면 개발 환경에 로그인한 Microsoft Entra 사용자가 필요합니다. 이 단계에서는 Microsoft Entra 사용자로 로그인하여 원하는 환경을 구성합니다.

  1. Windows용 Visual Studio는 Microsoft Entra 인증과 통합됩니다. Visual Studio에서 개발 및 디버깅을 사용하도록 설정하려면 Visual Studio의 메뉴에서 파일>계정 설정을 선택하여 Microsoft Entra 사용자를 추가하고 로그인 또는 추가를 선택합니다.

  2. Azure 서비스 인증의 Microsoft Entra 사용자를 설정하려면 메뉴에서 도구>옵션을 선택한 후 Azure 서비스 인증>계정 선택을 선택합니다. 추가한 Microsoft Entra 사용자를 선택하고 확인을 선택합니다.

Microsoft Entra 인증을 위해 개발 환경을 설정하는 방법에 대한 자세한 내용은 .NET용 Azure ID 클라이언트 라이브러리를 참조하세요.

이제 백 엔드 SQL Database에서 Microsoft Entra 인증을 사용하여 앱을 개발하고 디버그할 준비가 되었습니다.

5. 테스트 및 게시

  1. 개발 환경에서 코드를 실행합니다. 코드는 사용자 환경에서 로그인한 Microsoft Entra 사용자를 사용하여 백 엔드 데이터베이스에 연결합니다. 사용자는 데이터베이스에 대한 Microsoft Entra 관리자로 구성되어 있으므로 데이터베이스에 액세스할 수 있습니다.

  2. 기본 게시 방법을 사용하여 Azure에 코드를 게시합니다. App Service에서 코드는 앱의 관리 ID를 사용하여 백 엔드 데이터베이스에 연결합니다.

자주 묻는 질문

관리 ID가 SQL Server를 지원하나요?

예. 자세한 내용은 다음을 참조하세요.

Login failed for user '<token-identified principal>'. 오류가 발생합니다.

토큰을 요청하려는 관리 ID는 Azure 데이터베이스에 액세스할 수 있는 권한이 없습니다.

App Service 인증 또는 관련 앱 등록을 변경했습니다. 여전히 이전 토큰을 받는 이유는 무엇인가요?

또한 관리 ID의 백 엔드 서비스는 만료된 경우에만 대상 리소스에 대한 토큰을 업데이트하는 토큰 캐시를 유지 관리합니다. 앱에서 토큰을 얻으려고 시도한 구성을 수정하면 캐시된 토큰이 만료될 때까지 업데이트된 권한이 있는 새 토큰을 실제로 얻지 못합니다. 이 문제를 해결하려면 새로운 InPrivate(Edge)/private(Safari)/Incognito(Chrome) 창에서 변경 내용을 테스트하는 것이 가장 좋습니다. 그렇게 하면 인증된 새 세션에서 시작할 수 있습니다.

Microsoft Entra 그룹에 관리 ID를 추가하려면 어떻게 해야 하나요?

원하는 경우 ID를 Microsoft Entra 그룹에 추가한 다음 ID 대신 Microsoft Entra 그룹에 대한 액세스 권한을 부여할 수 있습니다. 예를 들어 다음 명령은 이전 단계의 관리 ID를 myAzureSQLDBAccessGroup이라는 새 그룹에 추가합니다.

groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

Microsoft Entra 그룹에 대한 데이터베이스 권한을 부여하려면 해당 데이터베이스 형식에 대한 설명서를 참조하세요.

SSL connection is required. Please specify SSL options and retry 오류가 발생합니다.

Azure 데이터베이스에 연결하려면 추가 설정이 필요하며 이 자습서의 범위를 벗어납니다. 자세한 내용은 다음 링크 중 하나를 참조하세요.

Azure Database for PostgreSQL에서 TLS 연결 구성 - 단일 서버Azure Database for MySQL에 안전하게 연결하도록 애플리케이션에서 SSL 연결 구성

웹앱 + 데이터베이스 템플릿을 사용하여 앱을 만들었는데 이제 서비스 커넥터 명령을 사용하여 관리 ID 연결을 구성할 수 없습니다.

서비스 커넥터는 앱 ID에 대한 액세스 권한을 부여하기 위해 데이터베이스에 대한 네트워크 액세스 권한이 필요합니다. 웹앱 + 데이터베이스 템플릿을 사용하여 Azure Portal에서 기본적으로 안전한 앱 및 데이터베이스 아키텍처를 만드는 경우 아키텍처는 데이터베이스에 대한 네트워크 액세스를 잠그고 가상 네트워크 내에서의 연결만 허용합니다. Azure Cloud Shell에도 마찬가지입니다. 그러나 가상 네트워크에 Cloud Shell을 배포한 다음, 해당 Cloud Shell에서 서비스 커넥터 명령을 실행할 수 있습니다.

다음 단계

학습한 내용은 다음과 같습니다.

  • Microsoft Entra 사용자를 Azure 데이터베이스의 관리자 권한으로 구성합니다.
  • Microsoft Entra 사용자로 데이터베이스에 연결합니다.
  • App Service 앱에 대해 시스템 할당 또는 사용자 할당 관리 ID를 구성합니다.
  • 관리 ID에 대한 데이터베이스 액세스 권한을 부여합니다.
  • 관리 ID를 사용하여 코드(.NET Framework 4.8, .NET 6, Node.js, Python, Java)에서 Azure 데이터베이스에 연결합니다.
  • Microsoft Entra 사용자를 사용하여 개발 환경에서 Azure 데이터베이스에 연결합니다.