162 lines
3.4 KiB
Markdown
162 lines
3.4 KiB
Markdown
좋아, 이어서 **3부. 보안과 커스터마이징**을 작성해볼게. 액추에이터를 실무에 적용할 때 꼭 필요한 보안 설정과 사용자 정의 방법을 중심으로 정리할게.
|
|
|
|
---
|
|
|
|
## **3부. 보안과 커스터마이징**
|
|
|
|
---
|
|
|
|
### **12장. 액추에이터 엔드포인트 보안**
|
|
|
|
#### 기본 설정
|
|
Spring Security를 사용할 경우, 액추에이터 엔드포인트는 기본적으로 인증이 필요함.
|
|
|
|
#### `application.yml`에서 노출 대상 설정
|
|
|
|
```yaml
|
|
management:
|
|
endpoints:
|
|
web:
|
|
exposure:
|
|
include: health, info, metrics
|
|
```
|
|
|
|
#### WebSecurityConfigurer를 통한 제어
|
|
|
|
```java
|
|
@Configuration
|
|
public class ActuatorSecurityConfig {
|
|
|
|
@Bean
|
|
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
|
http
|
|
.authorizeHttpRequests(auth -> auth
|
|
.requestMatchers("/actuator/health", "/actuator/info").permitAll()
|
|
.requestMatchers("/actuator/**").hasRole("ADMIN")
|
|
.anyRequest().authenticated()
|
|
)
|
|
.httpBasic();
|
|
return http.build();
|
|
}
|
|
}
|
|
```
|
|
|
|
> 인증 필요 시 기본 사용자 정보는 `application.yml`에서 설정
|
|
|
|
```yaml
|
|
spring:
|
|
security:
|
|
user:
|
|
name: admin
|
|
password: admin123
|
|
```
|
|
|
|
---
|
|
|
|
### **13장. 액추에이터 엔드포인트 커스터마이징**
|
|
|
|
#### 엔드포인트 비활성화
|
|
|
|
```yaml
|
|
management:
|
|
endpoint:
|
|
metrics:
|
|
enabled: false
|
|
```
|
|
|
|
#### 엔드포인트 경로 변경
|
|
|
|
```yaml
|
|
management:
|
|
endpoints:
|
|
web:
|
|
base-path: /manage
|
|
```
|
|
|
|
> 결과: `/manage/health`, `/manage/info` 등의 경로로 변경됨
|
|
|
|
#### 관리 포트를 분리
|
|
|
|
```yaml
|
|
management:
|
|
server:
|
|
port: 8081
|
|
```
|
|
|
|
> `/actuator`는 8081 포트에서만 노출됨. 일반 API는 기존 8080에서 제공됨
|
|
|
|
---
|
|
|
|
### **14장. 사용자 정의 엔드포인트 만들기**
|
|
|
|
#### 기본 구조
|
|
|
|
```java
|
|
@Component
|
|
@Endpoint(id = "customstatus")
|
|
public class CustomStatusEndpoint {
|
|
|
|
@ReadOperation
|
|
public Map<String, Object> customStatus() {
|
|
return Map.of(
|
|
"service", "My Service",
|
|
"status", "Running",
|
|
"timestamp", Instant.now()
|
|
);
|
|
}
|
|
}
|
|
```
|
|
|
|
> `GET /actuator/customstatus` 호출 시 결과 반환
|
|
|
|
```json
|
|
{
|
|
"service": "My Service",
|
|
"status": "Running",
|
|
"timestamp": "2025-04-07T10:00:00Z"
|
|
}
|
|
```
|
|
|
|
#### WriteOperation 예시 (POST)
|
|
|
|
```java
|
|
@WriteOperation
|
|
public String updateSomething(@Selector String id, @Nullable String value) {
|
|
// 업데이트 처리
|
|
return "Updated " + id + " to " + value;
|
|
}
|
|
```
|
|
|
|
> POST `/actuator/customstatus/myconfig?value=test` 등으로 호출 가능
|
|
|
|
---
|
|
|
|
### **15장. 상태 분류 및 외부 연동 대응**
|
|
|
|
#### Health 상태 분류 예시
|
|
|
|
```yaml
|
|
management:
|
|
health:
|
|
status:
|
|
http-mapping:
|
|
DOWN: 503
|
|
OUT_OF_SERVICE: 503
|
|
UP: 200
|
|
UNKNOWN: 200
|
|
```
|
|
|
|
> Kubernetes, AWS 등 상태 확인을 위한 HTTP 상태 코드 제어 가능
|
|
|
|
---
|
|
|
|
### **요약**
|
|
|
|
- 액추에이터는 민감한 정보를 다루므로 보안 설정이 필수
|
|
- 엔드포인트는 개별적으로 비활성화하거나 커스터마이징 가능
|
|
- 사용자 정의 엔드포인트로 비즈니스 모니터링도 가능
|
|
- 상태 값은 외부 환경(K8s 등)에 맞게 분류할 수 있음
|
|
|
|
---
|
|
|
|
다음은 **4부. 운영 환경 통합**으로 Prometheus, Grafana, Spring Boot Admin 같은 외부 시스템과의 통합 내용을 다루면 좋아. 계속 이어서 써줄까? |