Spring Boot 애플리케이션에서 Azure Key Vault에서 비밀 로드

이 자습서에서는 Spring Boot 애플리케이션에서 Key Vault를 사용하여 중요한 구성 데이터를 보호하고 Key Vault에서 구성 속성을 검색하는 방법을 보여 줍니다. Key Vault는 암호 및 데이터베이스 연결 문자열과 같은 안전한 일반 비밀 스토리지를 제공합니다.

필수 조건

Important

이 문서의 단계를 완료하려면 Spring Boot 버전 2.5 이상이 필요합니다.

Azure Key Vault에 비밀 설정

이 자습서에서는 Spring Boot 애플리케이션의 Key Vault에서 데이터베이스 자격 증명을 읽는 방법을 설명합니다. Key Vault에서 자격 증명을 읽으려면 먼저 Key Vault에 데이터베이스 자격 증명을 저장해야 합니다.

H2 데이터베이스의 URL을 Key Vault에 새 비밀로 저장하려면 빠른 시작: Azure Portal을 사용하여 Azure Key Vault에서 비밀 설정 및 검색을 참조하세요. 이 자습서에서는 이름과 h2urljdbc:h2:~/testdb;user=sa;password=password으로 비밀을 설정합니다.

참고 항목

비밀을 설정한 후 Key Vault 액세스 정책 할당의 지침에 따라 앱에 Key Vault에 대한 액세스 권한을 부여합니다.

Azure Key Vault에서 비밀 읽기

이제 데이터베이스 자격 증명이 Key Vault에 저장되었으므로 Spring Cloud Azure를 사용하여 검색할 수 있습니다.

Spring Cloud Azure Key Vault Starter 모듈을 설치하려면 pom.xml 파일에 다음 종속성을 추가합니다.

  • Spring Cloud AZURE BOM(청구서)

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    참고 항목

    Spring Boot 2.x를 사용하는 경우 버전을 .로 설정 spring-cloud-azure-dependencies 해야 합니다 4.17.0. 이 BOM(청구서)은 pom.xml 파일의 섹션에서 구성 <dependencyManagement> 해야 합니다. 이렇게 하면 모든 Spring Cloud Azure 종속성이 동일한 버전을 사용합니다. 이 BOM에 사용되는 버전에 대한 자세한 내용은 어떤 버전의 Spring Cloud Azure를 사용해야 하는지를 참조하세요.

  • Spring Cloud Azure Key Vault 시작 아티팩트:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    

Spring Cloud Azure에는 Key Vault에서 비밀을 읽는 몇 가지 방법이 있습니다. 다음 메서드를 독립적으로 사용하거나 다른 사용 사례에 대해 결합할 수 있습니다.

  • Key Vault에 Azure SDK를 사용합니다.
  • Spring KeyVault PropertySource를 사용합니다.

Key Vault에 Azure SDK 사용

Key Vault용 Azure SDK는 Key Vault에서 비밀을 관리하기 위해 제공합니다 SecretClient .

다음 코드 예제에서는 Azure Key Vault에서 H2 데이터베이스 자격 증명을 검색하는 데 사용하는 SecretClient 방법을 보여 줍니다.

Key Vault에서 Azure SDK를 사용하여 비밀을 읽으려면 다음 단계에 따라 애플리케이션을 구성합니다.

  1. application.properties 구성 파일에서 Key Vault 엔드포인트를 구성합니다.

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. SecretClient 다음 예제와 같이 Spring 애플리케이션에 콩을 주입하고 메서드를 사용하여 getSecret 비밀을 검색합니다.

    import com.azure.security.keyvault.secrets.SecretClient;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SecretClientApplication implements CommandLineRunner {
    
        // Spring Cloud Azure will automatically inject SecretClient in your ApplicationContext.
        private final SecretClient secretClient;
    
        public SecretClientApplication(SecretClient secretClient) {
            this.secretClient = secretClient;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(SecretClientApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
            System.out.println("h2url: " + secretClient.getSecret("h2url").getValue());
        }
    }
    

    이 자습서에서는 구성 또는 코드에 인증 작업이 없습니다. 그러나 Azure 서비스에 연결하려면 인증이 필요합니다. 인증을 완료하려면 Azure ID를 사용해야 합니다. Spring Cloud Azure는 코드 변경 없이 자격 증명을 가져오는 데 도움이 되는 Azure ID 라이브러리를 사용합니다 DefaultAzureCredential.

    DefaultAzureCredential은 여러 인증 방법을 지원하고 런타임에 사용할 방법을 결정합니다. 이 방법을 사용하면 앱이 환경별 코드를 구현하지 않고도 다양한 환경(예: 로컬 및 프로덕션 환경)에서 다양한 인증 방법을 사용할 수 있습니다. 자세한 내용은 DefaultAzureCredential을 참조 하세요.

    로컬 개발 환경에서 인증을 완료하려면 Azure CLI, Visual Studio Code, PowerShell 또는 기타 방법을 사용할 수 있습니다. 자세한 내용은 Java 개발 환경에서 Azure 인증을 참조 하세요. Azure 호스팅 환경에서 인증을 완료하려면 사용자 할당 관리 ID를 사용하는 것이 좋습니다. 자세한 내용은 Azure 리소스에 대한 관리 ID란?을 참조하세요.

  3. 애플리케이션을 시작합니다. 다음 예제와 유사한 로그가 표시됩니다.

    h2url: jdbc:h2:~/testdb;user=sa;password=password
    

당신은 혼자서 콩을 SecretClient 구축 할 수 있지만, 과정은 복잡하다. Spring Boot 애플리케이션에서는 속성을 관리하고, 작성기 패턴을 알아보고, Spring 애플리케이션 컨텍스트에 클라이언트를 등록해야 합니다. 다음 코드 예제에서는 콩을 빌드하는 SecretClient 방법을 보여줍니다.

import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SecretClientConfiguration {

    @Bean
    public SecretClient createSecretClient() {
        return new SecretClientBuilder()
            .vaultUrl("https://<your-key-vault-url>.vault.azure.net/")
            .credential(new DefaultAzureCredentialBuilder().build())
            .buildClient();
    }

}

다음 목록에서는 이 코드가 유연하지 않거나 정상적이지 않은 몇 가지 이유를 보여 줍니다.

  • Key Vault 엔드포인트는 하드 코딩됩니다.
  • Spring 환경에서 구성을 가져오는 데 사용하는 @Value 경우 application.properties 파일에 IDE 힌트를 가질 수 없습니다.
  • 마이크로 서비스 시나리오가 있는 경우 코드는 각 프로젝트에서 중복되어야 하며 실수를 하기 쉽고 일관성을 갖기 어렵습니다.

다행히 Spring Cloud Azure에서는 콩을 SecretClient 직접 빌드할 필요가 없습니다. 대신 이미 익숙한 구성 속성을 직접 삽입 SecretClient 하고 사용하여 Key Vault를 구성할 수 있습니다. 자세한 내용은 구성 예제를 참조 하세요.

또한 Spring Cloud Azure는 다양한 시나리오에 대해 다음과 같은 글로벌 구성을 제공합니다. 자세한 내용은 Spring Cloud Azure 개발자 가이드의 Azure 서비스 SDK 에 대한 전역 구성 섹션을 참조하세요.

  • 프록시 옵션입니다.
  • 다시 시도 옵션입니다.
  • HTTP 전송 클라이언트 옵션입니다.

다른 Azure 클라우드에 연결할 수도 있습니다. 자세한 내용은 다른 Azure 클라우드에 대한 커넥트 참조하세요.

Spring Key Vault PropertySource 사용

이전 섹션에서는 애플리케이션이 시작된 후 비밀을 읽는 데 사용하는 SecretClientCommandLineRunner 방법을 보여 줬습니다. 그러나 Spring Boot 애플리케이션에서는 애플리케이션이 시작되기 전에 비밀을 읽는 것이 필요합니다. 예를 들어 애플리케이션을 시작하기 전에 데이터 원본 암호 속성이 필요합니다. Key Vault에 데이터 원본 암호를 저장하고 Spring 자동 구성을 사용하여 데이터 원본을 얻으려면 이전 시나리오가 작동하지 않습니다.

이 경우 Spring Cloud Azure는 애플리케이션 컨텍스트를 빌드하기 전에 Key Vault에서 비밀을 로드하는 Spring 환경 통합을 제공합니다. 이 비밀을 사용하여 Spring 애플리케이션 컨텍스트 초기화 중에 빈을 구성하고 구성할 수 있습니다. 이 방법은 Key Vault에서 비밀에 액세스할 수 있는 투명한 방법이며 코드 변경이 필요하지 않습니다.

다음 코드 예제에서는 H2 데이터베이스 자격 증명을 검색하여 Azure Key Vault에서 데이터 원본을 빌드하는 방법을 PropertySource 보여 줍니다.

Spring Data JPA를 사용하여 Key Vault에서 H2 데이터베이스의 URL을 검색하고 H2 데이터베이스의 데이터를 저장하려면 다음 단계에 따라 애플리케이션을 구성합니다.

  1. application.properties 구성 파일에 다음 Key Vault 엔드포인트 및 데이터 원본 속성을 추가합니다.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://<your-keyvault-name>.vault.azure.net/
    spring.datasource.url=${h2url}
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
    

    Spring Cloud Azure 속성 구성의 예제는 Spring Cloud Azure 개발자 가이드의 구성 예제 섹션을 참조하세요.

    이 예제는 H2 데이터베이스를 사용하는 간단한 데이터베이스 시나리오입니다. 프로덕션 환경에서 Azure Database for MySQL 또는 Azure Database for PostgreSQL을 사용하고 Azure Key Vault에 데이터베이스 URL, 사용자 이름 및 암호를 저장하는 것이 좋습니다. 암호를 사용하지 않으려면 암호 없는 연결이 좋습니다. 자세한 내용은 Azure 서비스에 대한 암호 없는 연결을 참조 하세요.

  2. Todo Java 클래스를 만듭니다. 이 클래스는 JPA에서 자동으로 생성되는 테이블에 매핑 todo 되는 do기본 모델입니다. 다음 코드는 해당 및 setters 메서드를 getters 무시합니다.

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  3. 시작 클래스 파일을 편집하여 다음 콘텐츠를 표시합니다.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class KeyvaultApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(KeyvaultApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up "
                    + "correctly!", true)).toList())
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends JpaRepository<Todo, Long> {
    
    }
    
  4. 애플리케이션을 시작합니다. 애플리케이션은 Key Vault에서 H2 데이터베이스의 URL을 검색한 다음 H2 데이터베이스에 연결하고 데이터를 데이터베이스에 저장합니다. 다음 예제와 유사한 로그가 표시됩니다.

    2023-01-13 15:51:35.498 DEBUG 5616 --- [main] org.hibernate.SQL: insert into todo (description, details, done, id) values (?, ?, ?, ?)
    com.contoso.keyvault.Todo@1f
    

Azure Spring Apps에 배포

이제 Spring Boot 애플리케이션을 로컬로 실행했으므로 이제 프로덕션으로 이동해야 합니다. Azure Spring Apps 를 사용하면 코드를 변경하지 않고도 Spring Boot 애플리케이션을 Azure에 쉽게 배포할 수 있습니다. 이 서비스는 개발자가 코드에 집중할 수 있도록 Spring 애플리케이션의 인프라를 관리합니다. Azure Spring Apps는 포괄적인 모니터링 및 진단, 구성 관리, 서비스 검색, CI/CD 통합, 파란색-녹색 배포 등을 사용하여 수명 주기 관리를 제공합니다. Azure Spring Apps에 애플리케이션을 배포하려면 Azure Spring Apps에 첫 번째 애플리케이션 배포를 참조하세요.

다음 단계