[스프링 인 액션] 17. 스프링 관리하기

김하영·2021년 8월 26일
0
  • 이 장에서 배우는 내용
    스프링 부트 Admin 설정하기
    클라이언트 애플리케이션 등록하기
    엑추에이터 엔드포인트 소비(사용)하기
    Admin 서버의 보안

17.1 스프링 부트 Admin 사용하기

스프링 부트 Admin은 관리용 frontend 웹 애플리케이션이다.

액추에이터 앤드포인트는 두 개의 주요 구성 요소로 나뉜다. 스프링 부트 Admin과 이것의 클라이언트들이다.

Admin 서버는 스프링 부트 클라이언트라는 하나 이상의 스프링 부트 애플리케이션으로부터 제공되는 액추에이터 데이터를 수집하고 보여준다.

17.1.1 Admin 서버 생성하기

Admin 서버를 활성화하려면 새로운 스프링 부트 애플리케이션을 생성하고 Admin 서버 의존성을 프로젝트의 빌드에 추가해야 한다.
일반적으로 Admin 서버는 독립 실행형 애플리케이션으로 사용된다.
따라서 스프링 부트 Initializr를 사용하여 새로운 스프링 부트 프로젝트르 생성하면서 Spring Boot Admin (Server) 체크박스를 선택하는 것이 가장 쉽다.
이렇게 하면 프로젝트의 depencency에 아래와 같은 의존성이 추가 된다.

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>

그리고 다음과 같이 구성 클래스에 @EnableAdminServer 애노테이션을 지정하여 Admin 서버를 활성화해야 한다.

@SpringBootApplication
@EnableAdminServer
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

마지막으로 Admin 서버가 로컬로 실행되는 유일한 애플리케이션이 아니므로
고유하면서도 접근이 쉬운 포트를 리스닝하도록 설정해야 한다.
여기서는 스프링 부트 Admin 서버의 포트로 9090을 선택했다.

server:
  port: 9090

웹 브라우저에서 http://localhost:9090 접속하면 아래 그림과 같은 화면을 볼 수 있다.

17.1.2 Admin 클라이언트 등록하기

Admin 서버는 다른 스프링 부트 애플리케이션의 액추에이터 데이터를 보여주는 별개의 애플리케이션이므로 다른 애플리케이션을 Admin 서버가 알 수 있도록 클라이언트로 등록해야 한다.
스프링 부트 Admin 클라이언트를 Admin 서버에 등록하는 방법은 다음 두 가지가 있다.

  1. 각 애플리케이션이 자신을 Admin 서버에 등록한다.
  2. Admin 서버가 유레카 서비스 레지스트리를 통해서 서비스를 찾는다.

1. Admin 클라이언트 애플리케이션 구성하기

스프링 부트 애플리케이션이 자신을 Admin 서버의 클라이언트로 등록하려면 해당 애플리케이션의 빌드에 스프링 부트 Admin 클라이언트 스타터를 포함시켜야 한다.
이 경우 initializr에서는 의존성을 지정하는 대화상자에서 Ops를 확장한 후, 'Spring Boot Admin(Client)' 체크박스르 선택하면 쉽게 의존성을 추가할 수 있다.

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>

그리고 다음 내용을 각 클라이언트 애플리케이션의 application.yml 파일에 추가한다.

spring:
  application:
    name: ingredient-service
  boot:
    admin:
      client:
        url: http://localhost:9090
  1. Admin 클라이언트 찾기

서비스들을 찾을 수 있게 Admin 서버를 활성화할 때는 Admin 서버 프로젝트의 빌드에 스프링 클라우드 Netflix 유레카 클라이언트 스타터만 추가하면 된다.
이때 Admin 서버 프로젝트에 아래의 dependency만 추가하면 된다.

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<groupId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

이렇게 해서 Admin 서버가 유레카 클라이언트로 활성화되면 더 이상 추가로 해줄 것은 없다.
그리고 앞에서 얘기했던 모든 클라이어트의 application.yml 파일 구성을 하지 않아도 된다.
왜냐하면 유레카에 등록된 모든 애플리케이션을 Admin 서버가 자동으로 찾아서 그것의 액추에이터 데이터를 보여 주기 때문이다.

현재는 Admin 서버가 유레카 클라이언트이지만, 자신을 유레카 서비스로도 등록할 수 있다.
이때는 application.yml 파일에 아래와 같이 설정을 추가해주면 된다.

eureka:
  client:
    register-with-eureka: false

17.2 Admin 서버 살펴보기

  • Admin 서버에서 볼 수 있는 정보들
  1. 애플리케이션의 건강 상태 정보와 일반 정보
  2. Micrometer를 통해 발행되는 메트릭과 엔드포인트
  3. 환경 속성
  4. 패키지와 클래스의 로깅 레벨
  5. 스레드 추적 기록 정보
  6. HTTP 요청의 추적 기록
  7. 감사 로그

사실상 엑추에이터가 노출하는 거의 모든 것을 훨씬 더 인간 친화적인 형태로 Admin 서버에서 볼 수 있다.

17.3. Admin 서버의 보안

Admin 서버는 관리자만이 봐야 하는 애플리케이션 상세 내용을 노출하는 정보가 포함된다.
따라서 Admin 서버의 보안이 중요하고, Admin 서버에 보안을 추가하는 방법을 소개한다.

17.3.1 Admin 서버에 로그인 활성화하기

Admin 서버는 스프링 부트 애플리케이션이므로 다른 스프링 부트 애플리케이션에 하듯이 스프링 시큐리티를 사용해서 처리할 수 있다.

우선 Spring Security 의존성을 추가해야 한다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactdId>
</dependency>

그리고 무작위로 생성되는 비밀번호를 Admin 서버의 로그에서 계속 찾을 필요가 없도록 간단한 관리자 이름과 비밀번호를 application.yml 파일에 구성하면 된다.

spring:
  security:
    user:
      name: admin
      password: 53cr3t

17.3.2 액추에이터로 인증하기

16장에서 엑추에이터 엔드포인트의 보안을 처리하는 방법을 설명하였다.
이렇게 하면 액추에이터 엔드포인트에 지정한 인증 정보를 모르는 모든 사람의 접근을 막을 수 있다.
엑추에이터 엔드포인트가 인증 정보를 제공하지 않으면 Admin 서버도 엑추에이터 엔드포인트를 소비할 수 없게 된다.

Admin 서버의 클라이언트 애플리케이션 자신을 직접 Admin 서버에 등록하거나, 유레카를 통해 발견되게 함으로써 자신의 인증 정보를 Admin 서버에 제공할 수 있다.
만일 Admin 서버의 클라이언트 애플리케이션이 직접 Admin 서버에 등록한다면 등록할 때 자신의 인증 정보를 Admin 서버에 전송할 수 있다.

앤드포인트에 접근하는 데 사용할 수 있는 인증 정보는 각 클라이언트의 application.yml에 아래와 같은 속성을 지정한다.

spring:
  boot:
    admin:
      client:
        url: http://localhost:9090
        instance:
          metadata:
            user.name: ${spring.security.user.name}
            user.password: ${spring.security.user.password}

Admin 서버가 유레카를 통해 클라이언트 애플리케이션을 발견하도록 한다면 아래와 같이 속성을 설정해야 한다.

eureka:
  instance:
    metadata-map:
      user.name: admin
      user.password: password

요약

  • 스프링 부트 Admin 서버는 하나 이상의 스프링 부트 애플리케이션으로부터 액추에이터 엔드포인트를 소비하고 사용자 친화적인 웹 애플리케이션에서 데이터를 보여준다.

  • 스프링 부트 애플리케이션은 자신을 클라이언트로 Admin 서버에 등록할 수 있다.
    또는 Admin 서버가 유레카를 통해 클라이언트 애플리케이션을 찾게 할 수 있다.

  • 애플리케이션 상태의 스냅샷을 캡쳐하는 액추에이터 엔드포인트와는 다르게, Admin 서버는 애플리케이션의 내부 작업에 관한 실시간 뷰를 보여줄 수 있다.

  • Admin 서버는 액추에이터 엔드포인트의 결과를 쉽게 필터링해 주며, 경우에 따라서는 그래프로 데이터를 보여준다.

  • Admin 서버는 스프링 부트 애플리케이션이므로 스프링 시큐리티를 통해 사용할 수 있는 어떤 방법으로도 보안을 처리할 수 있다.

profile
Back-end Developer

0개의 댓글