Azure SQL Database에서 암호 없는 연결을 사용하도록 Java 애플리케이션 마이그레이션

이 문서에서는 기존 인증 방법에서 Azure SQL Database를 사용한 보다 안전한 암호 없는 연결로 마이그레이션하는 방법을 설명합니다.

Azure SQL Database에 대한 애플리케이션 요청은 인증되어야 합니다. Azure SQL Database는 앱이 안전하게 연결하는 여러 가지 방법을 제공합니다. 방법 중 하나는 암호를 사용하는 것입니다. 그러나 가능한 경우 애플리케이션에서 암호 없는 연결에 대한 우선 순위를 지정해야 합니다.

인증 옵션 비교

애플리케이션이 Azure SQL Database를 사용하여 인증하는 경우 데이터베이스에 연결할 사용자 이름과 암호 쌍을 제공합니다. ID가 저장되는 위치에 따라 Microsoft Entra 인증 및 Azure SQL Database 인증의 두 가지 인증 유형이 있습니다.

Microsoft Entra 인증

Microsoft Entra 인증은 Microsoft Entra ID에 정의된 ID를 사용하여 Azure SQL Database에 연결하는 메커니즘입니다. Microsoft Entra 인증을 사용하면 중앙 위치에서 데이터베이스 사용자 ID 및 기타 Microsoft 서비스 관리할 수 있으므로 권한 관리가 간소화됩니다.

인증에 Microsoft Entra ID를 사용하면 다음과 같은 이점이 제공됩니다.

  • 균일한 방식으로 Azure Services에서 사용자 인증
  • 한 곳에서 암호 정책 및 암호 회전 관리
  • Microsoft Entra ID에서 지원하는 여러 형태의 인증으로 암호를 저장할 필요가 없습니다.
  • 고객은 외부(Microsoft Entra ID) 그룹을 사용하여 데이터베이스 권한을 관리할 수 있습니다.
  • Microsoft Entra 인증은 Azure SQL 데이터베이스 사용자를 사용하여 데이터베이스 수준에서 ID를 인증합니다.
  • Azure SQL Database에 연결하는 애플리케이션에 대한 토큰 기반 인증 지원.

Azure SQL Database 인증

Azure SQL Database에서 계정을 만들 수 있습니다. 암호를 계정의 자격 증명으로 사용하도록 선택한 경우 이러한 자격 증명은 sys.database_principals 테이블에 저장됩니다. 이러한 암호는 Azure SQL Database에 저장되므로 암호 회전을 직접 관리해야 합니다.

암호를 사용하여 Azure SQL Database에 연결할 수 있지만 주의해서 사용해야 합니다. 안전하지 않은 위치에 암호를 노출하지 않도록 하려면 부지런해야 합니다. 암호에 대한 액세스 권한을 얻는 사람은 누구나 인증할 수 있습니다. 예를 들어 연결 문자열 실수로 소스 제어에 검사, 안전하지 않은 전자 메일을 통해 전송되거나, 잘못된 채팅에 붙여넣거나, 권한이 없어야 하는 사람이 볼 경우 악의적인 사용자가 애플리케이션에 액세스할 수 있는 위험이 있습니다. 대신 암호 없는 연결을 사용하도록 애플리케이션을 업데이트하는 것이 좋습니다.

암호 없는 연결 소개

암호 없는 연결을 사용하면 애플리케이션 코드, 구성 파일 또는 환경 변수에 자격 증명을 저장하지 않고도 Azure 서비스에 연결할 수 있습니다.

많은 Azure 서비스는 예를 들어 Azure 관리 ID를 통해 암호 없는 연결을 지원합니다. 이러한 기술은 Azure ID 클라이언트 라이브러리에서 DefaultAzureCredential을 사용하여 구현할 수 있는 강력한 보안 기능을 제공합니다. 이 자습서에서는 연결 문자열 같은 대안 대신 사용할 DefaultAzureCredential 기존 애플리케이션을 업데이트하는 방법을 알아봅니다.

DefaultAzureCredential은 여러 인증 방법을 지원하고 런타임에 사용해야 하는 방법을 자동으로 결정합니다. 이 방법을 사용하면 앱에서 환경별 코드를 구현하지 않고도 다양한 환경(로컬 개발 및 프로덕션)에서 다양한 인증 방법을 사용할 수 있습니다.

자격 증명을 검색하는 DefaultAzureCredential 순서 및 위치는 Azure ID 라이브러리 개요에서 찾을 수 있습니다. 예를 들어 로컬 DefaultAzureCredential 로 작업하는 경우 일반적으로 개발자가 Visual Studio에 로그인하는 데 사용한 계정을 사용하여 인증합니다. 앱이 Azure에 배포되면 DefaultAzureCredential에서 자동으로 관리 ID를 사용하도록 전환합니다. 이 전환에서는 코드를 변경할 필요가 없습니다.

연결이 암호 없는지 확인하려면 로컬 개발 및 프로덕션 환경을 모두 고려해야 합니다. 어느 곳에서든 연결 문자열 필요한 경우 애플리케이션은 암호가 없습니다.

로컬 개발 환경에서는 Azure CLI, Azure PowerShell, Visual Studio 또는 Visual Studio Code 또는 IntelliJ용 Azure 플러그 인으로 인증할 수 있습니다. 이 경우 속성을 구성하는 대신 애플리케이션에서 해당 자격 증명을 사용할 수 있습니다.

가상 머신과 같은 Azure 호스팅 환경에 애플리케이션을 배포할 때 해당 환경에서 관리 ID를 할당할 수 있습니다. 그런 다음 Azure 서비스에 연결하기 위해 자격 증명을 제공할 필요가 없습니다.

참고 항목

관리 ID는 앱 또는 서비스를 나타내는 보안 ID를 제공합니다. ID는 Azure 플랫폼에서 관리하며 비밀을 프로비전하거나 회전할 필요가 없습니다. 관리 ID는 개요 설명서에서 자세히 알아볼 수 있습니다.

참고 항목

Azure SQL Database용 JDBC 드라이버는 아직 로컬 환경의 암호 없는 연결을 지원하지 않으므로 이 문서에서는 Azure 호스팅 환경에 배포된 애플리케이션과 암호 없는 연결을 사용하도록 마이그레이션하는 방법에만 초점을 맞춥니다.

암호 없는 연결을 사용하도록 기존 애플리케이션 마이그레이션

다음 단계에서는 암호 기반 솔루션 대신 암호 없는 연결을 사용하도록 기존 애플리케이션을 마이그레이션하는 방법을 설명합니다.

0) 작업 환경 준비

먼저 다음 명령을 사용하여 일부 환경 변수를 설정합니다.

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)

자리 표시자를 이 문서 전체에서 사용되는 다음 값으로 바꿉 있습니다.

  • <YOUR_RESOURCE_GROUP>: 리소스가 있는 리소스 그룹의 이름입니다.
  • <YOUR_DATABASE_SERVER_NAME>: Azure SQL Database 서버의 이름입니다. Azure에서 고유해야 합니다.

1) Azure SQL Database 구성

1.1) Microsoft Entra ID 기반 인증 사용

Azure SQL Database에서 Microsoft Entra ID 액세스를 사용하려면 먼저 Microsoft Entra 관리 사용자를 설정해야 합니다. Microsoft Entra 관리 사용자만 Microsoft Entra ID 기반 인증에 대한 사용자를 만들거나 사용하도록 설정할 수 있습니다.

Azure CLI를 사용하는 경우 다음 명령을 실행하여 충분한 권한이 있는지 확인합니다.

az login --scope https://graph.microsoft.com/.default

그런 다음, 다음 명령을 실행하여 Microsoft Entra 관리자를 설정합니다.

az sql server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID

이 명령은 Microsoft Entra 관리자를 현재 로그인한 사용자로 설정합니다.

참고 항목

Azure SQL Database 서버당 하나의 Microsoft Entra 관리자만 만들 수 있습니다. 다른 항목을 선택하면 서버에 대해 구성된 기존 Microsoft Entra 관리자가 덮어쓰입니다.

2) 암호 없는 연결을 사용하도록 앱 코드 마이그레이션

다음으로, 다음 단계를 사용하여 암호 없는 연결을 사용하도록 코드를 업데이트합니다. 개념적으로 비슷하지만 각 언어는 서로 다른 구현 세부 정보를 사용합니다.

  1. 프로젝트 내에서 패키지에 다음 참조를 azure-identity 추가합니다. 이 라이브러리에는 암호 없는 연결을 구현하는 데 필요한 모든 엔터티가 포함되어 있습니다.

    <dependency>
         <groupId>com.azure</groupId>
         <artifactId>azure-identity</artifactId>
         <version>1.5.4</version>
    </dependency>
    
  2. JDBC URL.v에서 Microsoft Entra 관리 ID 인증을 사용하도록 설정합니다. 현재 Azure SQL Database에 연결할 위치를 만드는 java.sql.Connection 코드의 위치를 식별합니다. 코드를 다음 예제와 일치하도록 업데이트합니다.

    String url = "jdbc:sqlserver://$AZ_DATABASE_SERVER_NAME.database.windows.net:1433;databaseName=$AZ_DATABASE_NAME;authentication=ActiveDirectoryMSI;"   
    Connection con = DriverManager.getConnection(url);
    
  3. $AZ_DATABASE_SERVER_NAME 변수와 한 $AZ_DATABASE_NAME 변수를 이 문서의 시작 부분에서 구성한 값으로 바꿉니다.

  4. user JDBC URL에서 제거합니다password.

3) Azure 호스팅 환경 구성

애플리케이션이 암호 없는 연결을 사용하도록 구성된 후 동일한 코드가 Azure에 배포된 후 Azure 서비스에 인증할 수 있습니다. 예를 들어 관리 ID가 할당된 Azure 앱 Service 인스턴스에 배포된 애플리케이션은 Azure Storage에 연결할 수 있습니다.

이 섹션에서는 두 단계를 실행하여 암호 없는 방식으로 Azure 호스팅 환경에서 애플리케이션을 실행할 수 있도록 합니다.

  • Azure 호스팅 환경에 대한 관리 ID를 할당합니다.
  • 관리 ID에 역할을 할당합니다.

참고 항목

또한 Azure는 호스팅 서비스를 SQL Server와 연결하는 데 도움이 되는 서비스 커넥트or를 제공합니다. 서비스 커넥트or를 사용하여 호스팅 환경을 구성하면 Service 커넥트or에서 작업을 수행하므로 관리 ID에 역할을 할당하는 단계를 생략할 수 있습니다. 다음 섹션에서는 두 가지 방법으로 Azure 호스팅 환경을 구성하는 방법에 대해 설명합니다. 하나는 서비스 커넥트or를 통해, 다른 하나는 각 호스팅 환경을 직접 구성하여 구성합니다.

Important

서비스 커넥트or의 명령에는 Azure CLI 2.41.0 이상이 필요합니다.

Azure Portal을 사용하여 관리 ID 할당

다음 단계에서는 다양한 웹 호스팅 서비스에 시스템 할당 관리 ID를 할당하는 방법을 보여 줍니다. 관리 ID는 이전에 설정한 앱 구성을 사용하여 다른 Azure 서비스에 안전하게 연결할 수 있습니다.

  1. Azure 앱 Service 인스턴스의 기본 개요 페이지에서 탐색 창에서 ID를 선택합니다.

  2. 시스템 할당 탭에서 상태 필드를 켜야 합니다. 시스템이 할당한 ID는 내부적으로 Azure에서 관리되며 관리 작업을 처리합니다. ID의 세부 정보 및 ID는 코드에서 공개되지 않습니다.

    Screenshot of Azure portal Identity page of App Service resource with System assigned tab showing and Status field highlighted.

Azure CLI를 사용하여 Azure 호스팅 환경에서 관리 ID를 할당할 수도 있습니다.

다음 예제와 같이 az webapp identity assign 명령을 사용하여 Azure 앱 Service 인스턴스에 관리 ID를 할당할 수 있습니다.

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

관리 ID에 역할 할당

다음으로, SQL 데이터베이스에 액세스하기 위해 만든 관리 ID에 권한을 부여합니다.

서비스 커넥트or를 사용하여 서비스를 연결한 경우 이전 단계의 명령에 이미 역할이 할당되어 이 단계를 건너뛸 수 있습니다.

앱 테스트

이러한 코드를 변경한 후 애플리케이션을 빌드하고 다시 배포할 수 있습니다. 그런 다음 브라우저에서 호스트된 애플리케이션으로 이동합니다. 앱이 Azure SQL 데이터베이스에 성공적으로 연결할 수 있어야 합니다. 역할 할당이 Azure 환경을 통해 전파되는 데 몇 분 정도 걸릴 수 있습니다. 이제 개발자가 애플리케이션 자체에서 비밀을 관리하지 않고도 애플리케이션이 로컬 및 프로덕션 환경 모두에서 실행되도록 구성되었습니다.

다음 단계

이 자습서에서는 애플리케이션을 암호 없는 연결로 마이그레이션하는 방법을 알아보았습니다.

다음 리소스를 참조하여 이 문서에서 설명하는 개념을 자세히 살펴볼 수 있습니다.