Spring Boot를 사용하여 Secret Manager에서 사용자 인증 정보/보안 비밀 검색

1. 개요

비밀번호, API 키와 같은 보안 비밀은 안전하고 암호화된 스토리지에 저장하고 액세스를 제어하고 감사할 수 있어야 합니다. 일부 시스템에서는 Vault를 사용하여 이러한 보안 비밀을 저장합니다. Google Cloud에서는 관리형 서비스인 Secret Manager를 사용하여 보안 비밀을 안전하게 저장하고 IAM을 사용하여 개별 보안 비밀에 대한 액세스를 제어할 수 있습니다.

Spring Boot에서는 Spring Cloud GCP를 사용하여 다른 Spring 속성으로 참조하여 이러한 보안 비밀에 쉽게 액세스할 수 있습니다.

이 Codelab에서는 Secret Manager에 보안 비밀을 저장한 다음 간단한 Spring Boot 마이크로서비스를 빌드하고 보안 비밀을 검색합니다.

학습할 내용

  • Spring Boot Java 애플리케이션을 만들고 Secret Manager를 구성하는 방법

필요한 항목

  • Google Cloud 프로젝트
  • 브라우저(Chrome, Firefox 등)
  • Vim, EMACs, Nano 등의 표준 Linux 텍스트 편집기에 관한 기본 지식

이 튜토리얼을 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다 읽은 다음 연습 활동을 완료할 계획입니다

HTML/CSS 웹 앱 빌드 관련 사전지식 수준을 평가해 주세요.

초급 중급 고급

귀하의 Google Cloud 서비스 사용 경험을 평가해 주세요.

초급 중급 고급

2. 설정 및 요구사항

자습형 환경 설정

  1. Cloud Console에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 G Suite 계정이 없으면 만들어야 합니다.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZwci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID라고 부릅니다.

  1. 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.

이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Google Cloud Shell

Google Cloud 서비스는 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ를 클릭합니다.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

이전에 Cloud Shell을 시작하지 않았으면 설명이 포함된 중간 화면(스크롤해야 볼 수 있는 부분)이 제공됩니다. 이 경우 계속을 클릭합니다(이후 다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

가상 머신은 필요한 모든 개발 도구와 함께 로드됩니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list

명령어 출력

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

명령어 출력

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 출력

Updated property [core/project].

3. 보안 비밀 구성

Secret Manager를 사용하려면 먼저 API를 사용 설정하세요.

$ gcloud services enable secretmanager.googleapis.com

그런 다음 값이 Hellogreeting라는 보안 비밀을 만듭니다.

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

이 명령어는 STDIN를 사용하여 명령줄에 값을 제공합니다. 하지만 보안 비밀 값을 파일에 넣고 --data-file 인수의 파일 이름을 지정할 수도 있습니다.

gcloud CLI를 사용하여 모든 보안 비밀을 나열할 수 있습니다.

$ gcloud secrets list

4. 새 Spring Boot REST 서비스 만들기

Cloud Shell이 실행되면 명령줄을 사용하여 Spring Initializr로 새 Spring Boot 애플리케이션을 생성할 수 있습니다.

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
  -d dependencies=web,cloud-gcp \
  -d bootVersion=3.0.6 \
  -d type=maven-project \
  -d baseDir=hello-secret-manager | tar -xzvf - \
  && cd hello-secret-manager

pom.xml에서 Spring Cloud GCP 스타터 종속 항목을 추가합니다.

pom.xml

<project>
  ...

  <dependencies>
    ...
    <!-- Add Secret Manager Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
    </dependency>
  </dependencies>

  ...
</project>

src/main/resources/application.properties 파일에서 다음 구성을 추가하여 Spring Boot Config Data API를 사용 설정합니다.

spring.config.import=sm://

이렇게 하면 sm:// 프리픽스(예: sm://greeting)를 사용하여 속성 값으로 보안 비밀을 참조할 수 있도록 Spring 속성 소스가 구성됩니다.

속성 형식에 대한 자세한 내용은 Spring Cloud GCP Secret Manager 문서를 참고하세요. application.properties 요구사항은 Spring Cloud GCP 4.x에서 새로 도입되었습니다. 이전 가이드에서 자세히 알아보기

새 클래스 파일을 추가하여 새 REST 컨트롤러를 만듭니다.

src/main/java/com/example/demo/HelloSecretController.java

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSecretController {
  String greeting = "Hi";

  @GetMapping("/")
  public String hello() {
    return greeting + " World!";
  }
}

Spring Boot 플러그인을 사용하여 Spring Boot 애플리케이션을 정상적으로 시작할 수 있습니다.

JAVA_HOME이 올바른 JDK 버전으로 설정되어 있는지 확인합니다.

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

이 실습에서는 테스트를 건너뛰고 애플리케이션을 시작해 보겠습니다.

$ ./mvnw -DskipTests spring-boot:run

애플리케이션이 시작되면 Cloud Shell 툴바에서 웹 미리보기 아이콘 e18df08334f0d809.png을 클릭하고 포트 8080에서 미리보기를 선택합니다.

잠시 기다리면 다음과 같은 결과가 표시됩니다.

1e9a7884ff113c14.png

5. 보안 비밀 가져오기

@Value 주석을 사용하여 sm:// 접두사를 통해 보안 비밀 속성을 참조할 수 있습니다.

HelloSecretController 클래스에서 주석을 사용하여 greeting 값을 삽입합니다.

src/main/java/com/example/demo/HelloSecretController.java

import org.springframework.beans.factory.annotation.Value;

...

@RestController
public class HelloSecretController {
  @Value("${sm://greeting}")
  String greeting;

  ...
}

Spring Boot 플러그인을 사용하여 Spring Boot 애플리케이션을 정상적으로 시작할 수 있습니다. 이 실습의 테스트는 건너뛰겠습니다.

$ ./mvnw -DskipTests spring-boot:run

애플리케이션이 시작되면 Cloud Shell 툴바에서 웹 미리보기 아이콘 e18df08334f0d809.png을 클릭하고 포트 8080에서 미리보기를 선택합니다.

잠시 기다리면 다음과 같은 결과가 표시됩니다.

실행 중인 애플리케이션의 스크린샷, 'Hello World!'가 표시됨

application.properties의 속성에 값을 매핑할 수도 있습니다.

src/main/resources/application.properties

greeting=${sm://greeting}

HelloSecretController에서 Secret Manager 이름이 아닌 이 일반적인 속성 이름을 참조할 수 있습니다.

src/main/java/com/example/demo/HelloSecretController.java

@RestController
public class HelloSecretController {
  @Value("${greeting}")
  String greeting;
  ...
}

Spring Boot 플러그인을 사용하여 Spring Boot 애플리케이션을 정상적으로 시작할 수 있습니다. 이 실습의 테스트는 건너뛰겠습니다.

$ ./mvnw -DskipTests spring-boot:run

애플리케이션이 시작되면 Cloud Shell 툴바에서 웹 미리보기 아이콘 웹 미리보기 아이콘을 클릭하고 포트 8080에서 미리보기를 선택합니다.

보안 비밀 값 업데이트

sm://greeting 짧은 문법을 사용하면 최신 버전의 보안 비밀이 자동으로 사용됩니다. 보안 비밀의 새 버전을 만들면 코드를 변경하지 않고도 애플리케이션을 업데이트할 수 있습니다.

새 버전을 추가하여 보안 비밀의 값을 업데이트합니다.

$ echo -n "Greetings" |
 gcloud secrets versions add greeting \
 --data-file=-

애플리케이션을 다시 시작하면 새 버전의 보안 비밀이 반환됩니다.

실행 중인 애플리케이션의 스크린샷, 'Greetings World!'가 표시됨

이 개념 확장

이 기법은 특히 다른 Spring Boot 애플리케이션 프로필을 사용하는 경우에 유용합니다. 예를 들어 greeting-dev, greeting-staging, greeting-prod와 같은 보안 비밀을 만들 수 있습니다. 각 프로필에서 올바른 인사말로 매핑합니다.

greeting-prod 보안 비밀을 만듭니다.

$ echo -n "Hola" | \
 gcloud secrets create greeting-prod \
 --data-file=- --replication-policy=automatic

application-prod.properties 파일을 만듭니다.

src/main/resources/application-prod.properties

greeting=${sm://greeting-prod}

Spring Boot 플러그인을 사용하여 prod 프로필로 Spring Boot 애플리케이션을 정상적으로 시작할 수 있습니다. 이 실습의 테스트는 건너뛰겠습니다.

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

애플리케이션이 시작되면 Cloud Shell 툴바에서 웹 미리보기 아이콘 웹 미리보기 아이콘을 클릭하고 포트 8080에서 미리보기를 선택합니다.

잠시 기다리면 다음과 같은 결과가 표시됩니다.

'Hola World!'를 보여주는 실행 중인 애플리케이션의 스크린샷

6. 요약

이 실습에서는 sm://로 시작하는 Spring의 속성 이름을 사용하고 applications.properties 파일과 @Value 주석에서 값을 삽입하여 Secret Manager에 저장된 보안 비밀을 사용하여 구성할 수 있는 서비스를 만들었습니다.

7. 수고하셨습니다

Java에서 Secret Manager API를 사용하는 방법을 배웠습니다.

자세히 알아보기

라이선스

이 작업물은 크리에이티브 커먼즈 저작자표시 2.0 일반 라이선스에 따라 사용이 허가되었습니다.