์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ” Spring Boot Actuator ์—”๋“œํฌ์ธํŠธ ๋ณด์•ˆ ์„ค์ • ์™„๋ฒฝ ๊ฐ€์ด๋“œ 2025 ๐Ÿ”

๐Ÿ” Spring Boot Actuator ์—”๋“œํฌ์ธํŠธ ๋ณด์•ˆ ์„ค์ • ์™„๋ฒฝ ๊ฐ€์ด๋“œ 2025 ๐Ÿ”

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ๐Ÿ™‹โ€โ™‚๏ธ ์˜ค๋Š˜์€ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜ ๋„๊ตฌ์ธ Actuator์˜ ๋ณด์•ˆ ์„ค์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฒŒ์š”. 2025๋…„ ํ˜„์žฌ Spring Boot 3.2.x ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ตœ์‹  ๋ณด์•ˆ ํŠธ๋ Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

์š”์ฆ˜ ๋ณด์•ˆ ์ด์Šˆ ๋•Œ๋ฌธ์— ๋ฐค์ƒˆ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฑฐ ์ง„์งœ ๋…ธ์žผ์ด์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด ๊ธ€์„ ํ†ตํ•ด Actuator ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๋Œ€๋กœ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๊ฐ€์„ธ์š”! ๐Ÿ˜Ž

๐Ÿ“‘ ๋ชฉ์ฐจ

  1. Spring Boot Actuator๋ž€?
  2. Actuator ๋ณด์•ˆ์˜ ์ค‘์š”์„ฑ
  3. ๊ธฐ๋ณธ ๋ณด์•ˆ ์„ค์ • ๋ฐฉ๋ฒ•
  4. ์—”๋“œํฌ์ธํŠธ๋ณ„ ๋ณด์•ˆ ์„ค์ •
  5. Spring Security์™€ ํ†ตํ•ฉํ•˜๊ธฐ
  6. ์ปค์Šคํ…€ ๋ณด์•ˆ ์ •์ฑ… ๊ตฌํ˜„
  7. ์‹ค์ „ ์˜ˆ์ œ: ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ์„ค์ •
  8. ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€์˜ ์—ฐ๋™ ๋ณด์•ˆ
  9. ๋ณด์•ˆ ์„ค์ • ์ฒดํฌ๋ฆฌ์ŠคํŠธ
  10. ๋งˆ๋ฌด๋ฆฌ ๋ฐ ์ถ”๊ฐ€ ์ž๋ฃŒ

1. Spring Boot Actuator๋ž€? ๐Ÿค”

Spring Boot Actuator๋Š” ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Spring Boot์˜ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ์˜ˆ์š”. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ, ๋ฉ”ํŠธ๋ฆญ, ํ™˜๊ฒฝ ์„ค์ • ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ HTTP ์—”๋“œํฌ์ธํŠธ๋‚˜ JMX๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

2025๋…„ ํ˜„์žฌ Spring Boot 3.2.x ๋ฒ„์ „์—์„œ๋Š” ๋”์šฑ ๊ฐ•ํ™”๋œ Actuator ๊ธฐ๋Šฅ๊ณผ ๋ณด์•ˆ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”. ํŠนํžˆ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋‚˜ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ‘

๋จผ์ € Actuator๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด์š”:

// Gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'

// Maven
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

์ฃผ์š” Actuator ์—”๋“œํฌ์ธํŠธ

์—”๋“œํฌ์ธํŠธ ์„ค๋ช… ๋ณด์•ˆ ์ค‘์š”๋„
/actuator/health ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ์ •๋ณด ๋‚ฎ์Œ
/actuator/info ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด ๋‚ฎ์Œ
/actuator/metrics ๋ฉ”ํŠธ๋ฆญ ์ •๋ณด ์ค‘๊ฐ„
/actuator/env ํ™˜๊ฒฝ ์„ค์ • ์ •๋ณด ๋†’์Œ
/actuator/loggers ๋กœ๊น… ์„ค์ • ์ค‘๊ฐ„
/actuator/heapdump ํž™ ๋คํ”„ ์ƒ์„ฑ ๋†’์Œ
/actuator/shutdown ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ๋งค์šฐ ๋†’์Œ

2. Actuator ๋ณด์•ˆ์˜ ์ค‘์š”์„ฑ ๐Ÿ›ก๏ธ

์—ฌ๋Ÿฌ๋ถ„, Actuator ์—”๋“œํฌ์ธํŠธ๋Š” ์ง„์งœ ๋ณด์•ˆ์— ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”! ์™œ๋ƒ๊ณ ์š”? ใ…‹ใ…‹ใ…‹ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ํ™˜๊ฒฝ ๋ณ€์ˆ˜, DB ์ ‘์† ์ •๋ณด, ์‹ฌ์ง€์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ์žˆ๋Š”๋ฐ, ์ด๊ฒŒ ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜๋ฉด...? ๐Ÿ˜ฑ

๐Ÿšจ ๋ณด์•ˆ ์œ„ํ—˜ ์š”์†Œ

  1. ๋ฏผ๊ฐ ์ •๋ณด ๋…ธ์ถœ: env, configprops ์—”๋“œํฌ์ธํŠธ๋Š” DB ๋น„๋ฐ€๋ฒˆํ˜ธ, API ํ‚ค ๋“ฑ์„ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. ์„œ๋น„์Šค ์ค‘๋‹จ: shutdown ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์–ด์š”.
  3. ์‹œ์Šคํ…œ ์ •๋ณด ์œ ์ถœ: ๊ณต๊ฒฉ์ž๊ฐ€ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์š”.
  4. ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ: heapdump๋‚˜ threaddump ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ๋Š” ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์š”.
  5. ๊ถŒํ•œ ์ƒ์Šน: ์ผ๋ถ€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ถŒํ•œ ์ƒ์Šน์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์–ด์š”.

2024๋…„์—๋Š” ์‹ค์ œ๋กœ Actuator ์—”๋“œํฌ์ธํŠธ ๋ณด์•ˆ ์„ค์ • ๋ฏธํก์œผ๋กœ ์ธํ•œ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์œ ์ถœ ์‚ฌ๊ณ ๊ฐ€ ์žˆ์—ˆ๋‹ค๋Š” ๊ฑฐ ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”? ํ•œ ์œ ๋ช… ํ•€ํ…Œํฌ ํšŒ์‚ฌ์—์„œ env ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋…ธ์ถœ๋˜์–ด DB ์ ‘์† ์ •๋ณด๊ฐ€ ์œ ์ถœ๋˜์—ˆ๊ณ , ๊ฒฐ๊ตญ ๊ณ ๊ฐ ์ •๋ณด๊นŒ์ง€ ํƒˆ์ทจ๋‹นํ–ˆ๋‹ค๊ณ  ํ•ด์š”. ์ง„์งœ ํ—‰์†Œ๋ฆฌ ๋‚˜๋Š” ์‚ฌ๊ฑด์ด์—ˆ์ฃ ! ๐Ÿ˜ฐ

Actuator ๋ฏผ๊ฐ ์ •๋ณด DB ๋น„๋ฐ€๋ฒˆํ˜ธ API ํ‚ค Actuator ๋ณด์•ˆ ์œ„ํ—˜ ๋ณด์•ˆ๋˜์ง€ ์•Š์€ ์—”๋“œํฌ์ธํŠธ๋Š” ์‹ฌ๊ฐํ•œ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ณต๊ฒฉ์ž Spring Boot ์„œ๋ฒ„ ๋ฏผ๊ฐ ์ •๋ณด ์œ ์ถœ

๊ทธ๋ž˜์„œ ์žฌ๋Šฅ๋„ท์—์„œ๋„ Spring Boot ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•  ๋•Œ Actuator ๋ณด์•ˆ์— ํŠนํžˆ ์‹ ๊ฒฝ ์“ฐ๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์š”. ๊ฐœ๋ฐœ์ž ์žฌ๋Šฅ ๊ฑฐ๋ž˜๊ฐ€ ํ™œ๋ฐœํ•œ ํ”Œ๋žซํผ์ธ ๋งŒํผ, ๋ณด์•ˆ์— ๋Œ€ํ•œ ์ธ์‹๋„ ๋†’์€ ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ‘

3. ๊ธฐ๋ณธ ๋ณด์•ˆ ์„ค์ • ๋ฐฉ๋ฒ• ๐Ÿ”ง

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Actuator ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊ฒŒ์š”! ๊ธฐ๋ณธ์ ์ธ ์„ค์ •๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”?

3.1 ์—”๋“œํฌ์ธํŠธ ๋…ธ์ถœ ์ œํ•œํ•˜๊ธฐ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. application.properties ๋˜๋Š” application.yml ํŒŒ์ผ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

# application.properties
# ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ ๋น„ํ™œ์„ฑํ™” ํ›„ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ํ™œ์„ฑํ™”
management.endpoints.web.exposure.include=health,info
management.endpoints.web.exposure.exclude=env,beans

# application.yml
management:
  endpoints:
    web:
      exposure:
        include: "health,info"
        exclude: "env,beans"

2025๋…„ ํ˜„์žฌ Spring Boot 3.2.x ๋ฒ„์ „์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ /actuator/health์™€ /actuator/info๋งŒ ๋…ธ์ถœ๋˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ๋„ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ผญ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด๋Š” ๊ฒŒ ์ข‹์•„์š”! ๐Ÿ˜‰

3.2 ์—”๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

๊ธฐ๋ณธ /actuator ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์Šค์บ๋‹ ๊ณต๊ฒฉ์„ ์–ด๋А ์ •๋„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ฌผ๋ก  ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•œ ๋ณด์•ˆ์ด ๋˜์ง€ ์•Š์ง€๋งŒ, ๋ฐฉ์–ด์˜ ๊นŠ์ด๋ฅผ ๋”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

# application.properties
management.endpoints.web.base-path=/management

# application.yml
management:
  endpoints:
    web:
      base-path: "/management"

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด /actuator/health ๋Œ€์‹  /management/health๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ด์š”. ๊ทผ๋ฐ ์ด๊ฑฐ ์ง„์งœ ๊ฟ€ํŒ์ธ๋ฐ, ์•„๋ฌด๋„ ์˜ˆ์ƒ ๋ชปํ•˜๋Š” ๋ณต์žกํ•œ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•˜๋ฉด ๋” ์ข‹์•„์š”! ใ…‹ใ…‹ใ…‹ ์˜ˆ๋ฅผ ๋“ค์–ด /super-secret-monitoring-path-no-one-will-guess ๊ฐ™์€ ๊ฑฐ์š”! ๐Ÿ˜Ž

๐Ÿ’ก ๊ฟ€ํŒ

๊ฒฝ๋กœ ๋ณ€๊ฒฝ์€ ๋ณด์•ˆ์„ ์œ„ํ•œ ์ฒซ ๋‹จ๊ณ„์ผ ๋ฟ์ด์—์š”. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•œ ๋ณด์•ˆ์ด ๋˜์ง€ ์•Š์œผ๋‹ˆ, ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ์กฐ์น˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์„ธ์š”!

3.3 HTTPS ์ ์šฉํ•˜๊ธฐ

Actuator ์—”๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ HTTPS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”. ํ‰๋ฌธ ํ†ต์‹ ์„ ํ•˜๋ฉด ์ค‘๊ฐ„์— ์ •๋ณด๊ฐ€ ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”.

# application.properties
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your-password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
server.port=8443

2025๋…„์—๋Š” TLS 1.3์ด ํ‘œ์ค€์ด ๋˜์—ˆ์œผ๋‹ˆ, ๊ฐ€๋Šฅํ•˜๋ฉด TLS 1.3์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ๊ทธ๋ฆฌ๊ณ  ์ธ์ฆ์„œ๋Š” Let's Encrypt ๊ฐ™์€ ๋ฌด๋ฃŒ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด๋„ ์ถฉ๋ถ„ํ•ด์š”! ๐Ÿ”’

4. ์—”๋“œํฌ์ธํŠธ๋ณ„ ๋ณด์•ˆ ์„ค์ • ๐ŸŽฏ

๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๊ฐ™์€ ์ˆ˜์ค€์˜ ๋ณด์•ˆ์ด ํ•„์š”ํ•œ ๊ฑด ์•„๋‹ˆ์—์š”. ๊ฐ ์—”๋“œํฌ์ธํŠธ์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ๋ณด์•ˆ ์ˆ˜์ค€์„ ์กฐ์ •ํ•ด ๋ณผ๊นŒ์š”?

4.1 Health์™€ Info ์—”๋“œํฌ์ธํŠธ

health์™€ info ์—”๋“œํฌ์ธํŠธ๋Š” ๋ณดํ†ต ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์ด๋‚˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”. ์ด ์—”๋“œํฌ์ธํŠธ๋“ค์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜๊ณ , ๊ณต๊ฐœํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”.

# application.properties
# health ์—”๋“œํฌ์ธํŠธ์—์„œ ์ƒ์„ธ ์ •๋ณด ์ˆจ๊ธฐ๊ธฐ
management.endpoint.health.show-details=never
# ๋˜๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ƒ์„ธ ์ •๋ณด ๋ณด์—ฌ์ฃผ๊ธฐ
management.endpoint.health.show-details=when-authorized

# info ์—”๋“œํฌ์ธํŠธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
info.app.name=MyAwesomeApp
info.app.version=1.0.0
info.app.description=This is my awesome Spring Boot application

๊ทผ๋ฐ health ์—”๋“œํฌ์ธํŠธ๋„ DB ์—ฐ๊ฒฐ ์ƒํƒœ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, show-details ์˜ต์…˜์€ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒŒ ์ข‹์•„์š”! ๐Ÿ˜‰

4.2 ๋ฏผ๊ฐํ•œ ์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ

env, configprops, loggers ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ๋Š” ๋งค์šฐ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฐ ์—”๋“œํฌ์ธํŠธ๋Š” ๊ฐ•๋ ฅํ•œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ์„ค์ •์ด ํ•„์š”ํ•ด์š”.

# application.properties
# ๋ฏผ๊ฐํ•œ ์—”๋“œํฌ์ธํŠธ ๋น„ํ™œ์„ฑํ™”
management.endpoint.env.enabled=false
management.endpoint.configprops.enabled=false

# ๋˜๋Š” ํŠน์ • ์—”๋“œํฌ์ธํŠธ๋งŒ ํ™œ์„ฑํ™”
management.endpoints.enabled-by-default=false
management.endpoint.health.enabled=true
management.endpoint.info.enabled=true

2025๋…„์—๋Š” Zero Trust ๋ณด์•ˆ ๋ชจ๋ธ์ด ๋Œ€์„ธ์ธ๋ฐ์š”, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ถŒ์žฅ๋ผ์š”. ์ง„์งœ ์ด๊ฑฐ ์‹ค๋ฌด์—์„œ ์—„์ฒญ ์ค‘์š”ํ•ด์š”! ๐Ÿ”ฅ

4.3 Shutdown ์—”๋“œํฌ์ธํŠธ ๋ณดํ˜ธ

shutdown ์—”๋“œํฌ์ธํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด์—์š”. ์ด๊ฑด ์ •๋ง ์œ„ํ—˜ํ•˜๋‹ˆ๊นŒ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹์•„์š”.

# application.properties
# shutdown ์—”๋“œํฌ์ธํŠธ ํ™œ์„ฑํ™” (ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ!)
management.endpoint.shutdown.enabled=true

๋งŒ์•ฝ ์ •๋ง ํ•„์š”ํ•ด์„œ ํ™œ์„ฑํ™”ํ•œ๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ๊ฐ•๋ ฅํ•œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ์„ค์ •์„ ํ•ด์•ผ ํ•ด์š”! ์•ˆ ๊ทธ๋Ÿฌ๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ์žฅ๋‚œ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊บผ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ์–ด์š”. ใ…‹ใ…‹ใ…‹ ์ƒ์ƒ๋งŒ ํ•ด๋„ ์•„์ฐ”ํ•˜์ฃ ? ๐Ÿ˜ฑ

Actuator ์—”๋“œํฌ์ธํŠธ ๋ณด์•ˆ ์ˆ˜์ค€ ๋†’์Œ ์ค‘๊ฐ„ ๋‚ฎ์Œ shutdown ๋งค์šฐ ์œ„ํ—˜ env ๋ฏผ๊ฐ ์ •๋ณด heapdump ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด loggers ๋กœ๊ทธ ์„ค์ • metrics ์„ฑ๋Šฅ ์ง€ํ‘œ info ๊ธฐ๋ณธ ์ •๋ณด health ์ƒํƒœ ํ™•์ธ ์—”๋“œํฌ์ธํŠธ๋ณ„ ๋ณด์•ˆ ์ค‘์š”๋„ ๋ฐ ํ•„์š” ๋ณดํ˜ธ ์ˆ˜์ค€

5. Spring Security์™€ ํ†ตํ•ฉํ•˜๊ธฐ ๐Ÿ”’

Actuator ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๋Œ€๋กœ ๋ณดํ˜ธํ•˜๋ ค๋ฉด Spring Security์™€ ํ†ตํ•ฉํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ด์—์š”. ์ด์ œ ๊ทธ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊ฒŒ์š”!

5.1 Spring Security ์˜์กด์„ฑ ์ถ”๊ฐ€

// Gradle
implementation 'org.springframework.boot:spring-boot-starter-security'

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

Spring Security๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ์— ์ธ์ฆ์ด ํ•„์š”ํ•˜๊ฒŒ ๋ผ์š”. ๊ทผ๋ฐ ์ด๊ฑฐ ์ถ”๊ฐ€ํ•˜์ž๋งˆ์ž ์ฝ˜์†”์— ์ž๋™์ƒ์„ฑ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋‚˜์˜ค๋Š” ๊ฑฐ ๋ณด๊ณ  ๋‹นํ™ฉํ–ˆ๋˜ ๊ธฐ์–ต ๋‹ค๋“ค ์žˆ์œผ์‹œ์ฃ ? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜…

5.2 ๊ธฐ๋ณธ ๋ณด์•ˆ ์„ค์ •

Spring Security ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด Actuator ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ๋ณด์•ˆ์„ ์„ค์ •ํ•ด ๋ณผ๊ฒŒ์š”.

@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .requestMatchers(EndpointRequest.to("health", "info")).permitAll()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR_ADMIN")
                .anyRequest().authenticated()
            .and()
            .httpBasic();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("admin")
            .password("securePassword123!")
            .roles("ACTUATOR_ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

์œ„ ์ฝ”๋“œ๋Š” health์™€ info ์—”๋“œํฌ์ธํŠธ๋Š” ๋ชจ๋‘์—๊ฒŒ ๊ณต๊ฐœํ•˜๊ณ , ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ๋Š” ACTUATOR_ADMIN ์—ญํ• ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ ๊ฑฐ์˜ˆ์š”.

โš ๏ธ ์ฃผ์˜

์œ„ ์˜ˆ์ œ์—์„œ User.withDefaultPasswordEncoder()๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”! ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋” ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5.3 Spring Security 5.7+ ๋ฐ Spring Boot 3.x ์„ค์ •

2025๋…„ ํ˜„์žฌ ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” WebSecurityConfigurerAdapter๊ฐ€ deprecated๋˜์—ˆ์–ด์š”. ๋Œ€์‹  SecurityFilterChain์„ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์š”.

@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers(EndpointRequest.to("health", "info")).permitAll()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR_ADMIN")
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.builder()
            .username("admin")
            .password("{bcrypt}" + new BCryptPasswordEncoder().encode("securePassword123!"))
            .roles("ACTUATOR_ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

์ด ๋ฐฉ์‹์ด ์ตœ์‹  Spring Security์˜ ๊ถŒ์žฅ ๋ฐฉ์‹์ด์—์š”. ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ๋” ๊น”๋”ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ˜Ž

5.4 JWT ๋˜๋Š” OAuth2๋ฅผ ์ด์šฉํ•œ ๊ณ ๊ธ‰ ์ธ์ฆ

์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Basic ์ธ์ฆ๋ณด๋‹ค JWT๋‚˜ OAuth2 ๊ฐ™์€ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers(EndpointRequest.to("health", "info")).permitAll()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).hasAuthority("SCOPE_actuator.admin")
                .anyRequest().authenticated()
            )
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(jwt -> jwt
                    .jwtAuthenticationConverter(jwtAuthenticationConverter())
                )
            );
        
        return http.build();
    }

    private Converter<Jwt, ? extends AbstractAuthenticationToken> jwtAuthenticationConverter() {
        JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
        converter.setJwtGrantedAuthoritiesConverter(jwt -> {
            List<String> scopes = jwt.getClaimAsStringList("scope");
            return scopes.stream()
                .map(scope -> new SimpleGrantedAuthority("SCOPE_" + scope))
                .collect(Collectors.toList());
        });
        return converter;
    }
}

์ด๋ ‡๊ฒŒ JWT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์ด ๋” ์ ํ•ฉํ•ด์š”! ๐Ÿš€

์žฌ๋Šฅ๋„ท์—์„œ๋„ ์ด์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ API ๋ณด์•ˆ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”. ๊ฐœ๋ฐœ์ž ์žฌ๋Šฅ ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์ธ ๋งŒํผ ๋ณด์•ˆ์— ์‹ ๊ฒฝ์„ ๋งŽ์ด ์“ฐ๋Š” ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ‘

6. ์ปค์Šคํ…€ ๋ณด์•ˆ ์ •์ฑ… ๊ตฌํ˜„ ๐Ÿ› ๏ธ

๋” ์„ธ๋ฐ€ํ•œ ๋ณด์•ˆ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ปค์Šคํ…€ ๋ณด์•ˆ ์ •์ฑ…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด์ œ ๋ช‡ ๊ฐ€์ง€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์„ ์•Œ์•„๋ณผ๊ฒŒ์š”!

6.1 IP ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œํ•œ

ํŠน์ • IP ์ฃผ์†Œ๋‚˜ IP ๋ฒ”์œ„์—์„œ๋งŒ Actuator์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers(EndpointRequest.toAnyEndpoint())
                .access(new IpAddressAuthorizationManager("192.168.1.0/24", "10.0.0.0/8"))
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        
        return http.build();
    }
}

class IpAddressAuthorizationManager implements AuthorizationManager<RequestAuthorizationContext> {
    private final List<IpAddressMatcher> ipAddressMatchers;

    public IpAddressAuthorizationManager(String... ipAddresses) {
        this.ipAddressMatchers = Arrays.stream(ipAddresses)
            .map(IpAddressMatcher::new)
            .collect(Collectors.toList());
    }

    @Override
    public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext context) {
        HttpServletRequest request = context.getRequest();
        String remoteAddr = request.getRemoteAddr();
        
        boolean matches = ipAddressMatchers.stream()
            .anyMatch(matcher -> matcher.matches(remoteAddr));
        
        return new AuthorizationDecision(matches);
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง€์ •๋œ IP ๋ฒ”์œ„์—์„œ๋งŒ Actuator์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋‚˜ VPN์„ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ด์š”! ๐Ÿ”

6.2 ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œํ•œ

ํŠน์ • ์‹œ๊ฐ„๋Œ€์—๋งŒ Actuator์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—…๋ฌด ์‹œ๊ฐ„์—๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค๋“ ์ง€์š”.

@Component
public class TimeBasedAccessDecisionVoter implements AccessDecisionVoter<Object> {

    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {
        LocalTime now = LocalTime.now();
        
        // ์—…๋ฌด ์‹œ๊ฐ„: ์˜ค์ „ 9์‹œ ~ ์˜คํ›„ 6์‹œ
        if (now.isAfter(LocalTime.of(9, 0)) && now.isBefore(LocalTime.of(18, 0))) {
            return ACCESS_GRANTED;
        }
        
        return ACCESS_DENIED;
    }
}

์ด๋Ÿฐ ์‹์œผ๋กœ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทผ๋ฐ ์ด๊ฑฐ ์ง„์งœ ์‹ค์šฉ์ ์ธ ํŒ์ธ๋ฐ, ์‹ฌ์•ผ ์‹œ๊ฐ„๋Œ€์—๋Š” ์ค‘์š” ์„ค์ • ๋ณ€๊ฒฝ์„ ๋ง‰์•„์„œ "์•ผ๊ทผํ•˜๋‹ค๊ฐ€ ์‹ค์ˆ˜๋กœ ํ”„๋กœ๋•์…˜ ๋‚ ๋ ค๋จน๋Š”" ์ฐธ์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”! ใ…‹ใ…‹ใ…‹ ๐Ÿ˜‚

6.3 ๋‹ค์ค‘ ์ธ์ฆ ์š”์†Œ(MFA) ์ ์šฉ

์ค‘์š”ํ•œ Actuator ์—”๋“œํฌ์ธํŠธ์—๋Š” ๋‹ค์ค‘ ์ธ์ฆ ์š”์†Œ(MFA)๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„๋ฐ€๋ฒˆํ˜ธ + OTP ๊ฐ™์€ ๋ฐฉ์‹์ด์š”.

2025๋…„์—๋Š” FIDO2/WebAuthn ํ‘œ์ค€์ด ๋„๋ฆฌ ๋ณด๊ธ‰๋˜์–ด ์ƒ์ฒด ์ธ์ฆ๊นŒ์ง€ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”. Spring Security์—์„œ๋„ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ํ™•์žฅ ๋ชจ๋“ˆ์ด ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ”

๐Ÿ’ก ๊ฟ€ํŒ

๋ณด์•ˆ์€ ์—ฌ๋Ÿฌ ์ธต์˜ ๋ฐฉ์–ด ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”. ๋‹จ์ผ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์—๋งŒ ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์—ฌ๋Ÿฌ ๋ฐฉ์‹์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”!

7. ์‹ค์ „ ์˜ˆ์ œ: ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ์„ค์ • ๐ŸŽฎ

์ด์ œ ์‹ค์ œ ํ˜„์—…์—์„œ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„๋กœ Actuator ๋ณด์•ˆ ์„ค์ •์„ ์•Œ์•„๋ณผ๊ฒŒ์š”!

7.1 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋””๋ฒ„๊น…๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋” ๋งŽ์€ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

# application-dev.properties
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

# ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ ๊ฐ„๋‹จํ•œ ๋ณด์•ˆ ์„ค์ •
spring.security.user.name=dev
spring.security.user.password=dev-password
spring.security.user.roles=ACTUATOR_ADMIN

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋ผ๊ณ  ๋ณด์•ˆ์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๋ฉด ์•ˆ ๋ผ์š”! ์ตœ์†Œํ•œ์˜ ๋ณด์•ˆ ์„ค์ •์€ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ๊ทธ๋ž˜์•ผ ์‹ค์ˆ˜๋กœ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ ์šฉ๋์„ ๋•Œ ๋Œ€์ฐธ์‚ฌ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜…

7.2 ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ •

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ค์ œ ํ”„๋กœ๋•์…˜๊ณผ ์œ ์‚ฌํ•œ ๋ณด์•ˆ ์„ค์ •์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

# application-test.properties
management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=when-authorized

# ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์šฉ ๋ณด์•ˆ ์„ค์ •
spring.security.user.name=${TEST_ACTUATOR_USER}
spring.security.user.password=${TEST_ACTUATOR_PASSWORD}
spring.security.user.roles=ACTUATOR_ADMIN

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ž๊ฒฉ ์ฆ๋ช…์„ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ์†Œ์Šค ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ๊ฑฐ๋“ ์š”! ๐Ÿ”’

7.3 ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์„ค์ •

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ตœ์†Œํ•œ์˜ ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ๋งŒ ๋…ธ์ถœํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ ์ ์šฉํ•ด์•ผ ํ•ด์š”.

# application-prod.properties
management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=never
management.endpoints.web.base-path=/management/actuator

# ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Spring Security ์„ค์ • ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์ ์šฉ

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ ˆ๋Œ€๋กœ ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ผ์š”! ๊ฐ•๋ ฅํ•˜๊ณ  ๋ณต์žกํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ •๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ์•„๋‹ˆ๋ฉด ์•„์˜ˆ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”! ๐Ÿ›ก๏ธ

7.4 ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค/ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ์„ค์ •

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋‚˜ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋น„์Šค ๋ฉ”์‹œ๋‚˜ ์ธ๊ทธ๋ ˆ์Šค ๋ ˆ๋ฒจ์—์„œ ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

# Kubernetes Ingress ์„ค์ • ์˜ˆ์‹œ
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: actuator-ingress
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8,192.168.0.0/16"
spec:
  rules:
  - host: actuator.myapp.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 8080

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ํ†ตํ•ด Actuator ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๊ณ„์ธต์—์„œ ๋ณด์•ˆ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”! ๐Ÿš€

ํ™˜๊ฒฝ๋ณ„ Actuator ๋ณด์•ˆ ์„ค์ • ๋น„๊ต ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์Šคํ…Œ์ด์ง• ํ™˜๊ฒฝ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋…ธ์ถœ ์—”๋“œํฌ์ธํŠธ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ ๋…ธ์ถœ ์—”๋“œํฌ์ธํŠธ health, info, metrics ๋…ธ์ถœ ์—”๋“œํฌ์ธํŠธ health, info, metrics ๋…ธ์ถœ ์—”๋“œํฌ์ธํŠธ health, info๋งŒ ์ธ์ฆ ๋ฐฉ์‹ ๊ธฐ๋ณธ ์ธ์ฆ ์ธ์ฆ ๋ฐฉ์‹ ๊ธฐ๋ณธ ์ธ์ฆ + IP ์ œํ•œ ์ธ์ฆ ๋ฐฉ์‹ JWT ํ† ํฐ ์ธ์ฆ ์ธ์ฆ ๋ฐฉ์‹ JWT + MFA ์ ‘๊ทผ ์ œํ•œ ์ตœ์†Œํ•œ์˜ ์ œํ•œ ์ ‘๊ทผ ์ œํ•œ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋งŒ ์ ‘๊ทผ ์ œํ•œ VPN + ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œํ•œ VPN + ์—ญํ•  + ์‹œ๊ฐ„ ์ œํ•œ ๋ณด์•ˆ ์ˆ˜์ค€ ๊ธฐ๋ณธ ๋ณด์•ˆ ์ˆ˜์ค€ ์ค‘๊ฐ„ ๋ณด์•ˆ ์ˆ˜์ค€ ๋†’์Œ ๋ณด์•ˆ ์ˆ˜์ค€ ๋งค์šฐ ๋†’์Œ

8. ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€์˜ ์—ฐ๋™ ๋ณด์•ˆ ๐Ÿ“Š

Actuator๋Š” ๋ณดํ†ต Prometheus, Grafana, Datadog ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ผ์š”. ์ด๋Ÿฐ ๋„๊ตฌ๋“ค๊ณผ ์—ฐ๋™ํ•  ๋•Œ๋„ ๋ณด์•ˆ์„ ์‹ ๊ฒฝ ์จ์•ผ ํ•ด์š”!

8.1 Prometheus ์—ฐ๋™ ์‹œ ๋ณด์•ˆ ์„ค์ •

Prometheus๋Š” metrics ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด์š”.

# application.properties
management.endpoints.web.exposure.include=prometheus
management.metrics.export.prometheus.enabled=true

# Prometheus ์„ค์ • (prometheus.yml)
scrape_configs:
  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus'
    basic_auth:
      username: 'prometheus'
      password: 'secure-password-here'
    scheme: https
    tls_config:
      insecure_skip_verify: false
    static_configs:
      - targets: ['myapp.example.com:8080']

Prometheus ์—ฐ๋™ ์‹œ์—๋„ HTTPS์™€ ๊ธฐ๋ณธ ์ธ์ฆ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ๊ทธ๋ฆฌ๊ณ  Prometheus ์„œ๋ฒ„ IP๋ฅผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”! ๐Ÿ“ˆ

8.2 Grafana ์—ฐ๋™ ์‹œ ๋ณด์•ˆ ์„ค์ •

Grafana๋Š” ๋ณดํ†ต Prometheus๋ฅผ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ง์ ‘ Actuator์— ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

# Grafana ๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ค์ •
{
  "name": "Spring Boot App",
  "type": "prometheus",
  "url": "https://prometheus.example.com",
  "access": "proxy",
  "basicAuth": true,
  "basicAuthUser": "grafana",
  "secureJsonData": {
    "basicAuthPassword": "secure-password-here"
  }
}

Grafana ์ž์ฒด์—๋„ ๊ฐ•๋ ฅํ•œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ์„ค์ •์„ ์ ์šฉํ•ด์•ผ ํ•ด์š”. ๋Œ€์‹œ๋ณด๋“œ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”! ๐Ÿ”’

8.3 Spring Boot Admin ์—ฐ๋™ ์‹œ ๋ณด์•ˆ ์„ค์ •

Spring Boot Admin์€ ์—ฌ๋Ÿฌ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”.

# Spring Boot Admin Server ์„ค์ •
spring.boot.admin.client.url=https://admin.example.com
spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}
spring.boot.admin.client.username=admin-server
spring.boot.admin.client.password=secure-admin-password

# Spring Boot Admin Client ์„ค์ •
spring.boot.admin.client.instance.name=My App
spring.boot.admin.client.instance.prefer-ip=true

Spring Boot Admin์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ๋„ ๋ณดํ˜ธํ•ด์•ผ ํ•ด์š”. ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”! ๐Ÿ”

๐Ÿ’ก ๊ฟ€ํŒ

๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์— ์ฝ๊ธฐ ์ „์šฉ ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„๋Š” ๋ณ„๋„์˜ ๋ณด์•ˆ ๋„คํŠธ์›Œํฌ ์˜์—ญ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค!

9. ๋ณด์•ˆ ์„ค์ • ์ฒดํฌ๋ฆฌ์ŠคํŠธ โœ…

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ Actuator ๋ณด์•ˆ ์„ค์ • ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”!

๐Ÿ” Actuator ๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  1. ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ๋งŒ ๋…ธ์ถœํ•˜๊ธฐ

    management.endpoints.web.exposure.include ์„ค์ •์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ๋งŒ ๋…ธ์ถœํ•˜์„ธ์š”.

  2. ๊ธฐ๋ณธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

    management.endpoints.web.base-path ์„ค์ •์„ ํ†ตํ•ด ๊ธฐ๋ณธ /actuator ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์„ธ์š”.

  3. HTTPS ์ ์šฉํ•˜๊ธฐ

    ๋ชจ๋“  Actuator ํ†ต์‹ ์— HTTPS๋ฅผ ์ ์šฉํ•˜์„ธ์š”.

  4. Spring Security ์ ์šฉํ•˜๊ธฐ

    Spring Security๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ์„ค์ •์„ ์ ์šฉํ•˜์„ธ์š”.

  5. ๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉํ•˜๊ธฐ

    ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ๊ฐ•๋ ฅํ•˜๊ณ  ๋ณต์žกํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  6. IP ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œํ•œ ์ ์šฉํ•˜๊ธฐ

    ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” IP ์ฃผ์†Œ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•˜์„ธ์š”.

  7. ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ˆจ๊ธฐ๊ธฐ

    health ์—”๋“œํฌ์ธํŠธ์˜ ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ ์„ค์ •์„ ์ œํ•œํ•˜์„ธ์š”.

  8. shutdown ์—”๋“œํฌ์ธํŠธ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ

    ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด shutdown ์—”๋“œํฌ์ธํŠธ๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.

  9. ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ๋ถ„๋ฆฌํ•˜๊ธฐ

    ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๋ณ„๋กœ ์ ์ ˆํ•œ ๋ณด์•ˆ ์„ค์ •์„ ์ ์šฉํ•˜์„ธ์š”.

  10. ์ •๊ธฐ์ ์ธ ๋ณด์•ˆ ๊ฐ์‚ฌ ์ˆ˜ํ–‰ํ•˜๊ธฐ

    ์ •๊ธฐ์ ์œผ๋กœ Actuator ์—”๋“œํฌ์ธํŠธ์˜ ๋ณด์•ˆ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜์„ธ์š”.

์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋ผ ์„ค์ •ํ•˜๋ฉด Actuator ์—”๋“œํฌ์ธํŠธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์–ด์š”! ํ•˜๋‚˜๋ผ๋„ ๋†“์น˜๋ฉด ๋ณด์•ˆ ์œ„ํ—˜์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ผผ๊ผผํ•˜๊ฒŒ ํ™•์ธํ•˜์„ธ์š”! ๐Ÿ›ก๏ธ

๋ณด์•ˆ ์„ค์ • ๊ฒ€์ฆ ๋„๊ตฌ

์„ค์ •์ด ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ์š”.

  1. Spring Boot Actuator Security Audit

    Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Actuator ๋ณด์•ˆ ์„ค์ •์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”.

  2. OWASP ZAP

    ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์Šค์บ”ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ์˜ˆ์š”.

  3. Nmap

    ๋„คํŠธ์›Œํฌ ํฌํŠธ ์Šค์บ”์„ ํ†ตํ•ด ์—ด๋ ค ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

  4. Burp Suite

    ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”.

  5. Spring Security Check

    Spring Security ์„ค์ •์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”.

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์ •๊ธฐ์ ์œผ๋กœ ๋ณด์•ˆ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ํŠนํžˆ ์„ค์ • ๋ณ€๊ฒฝ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ฒ€์ฆ์„ ํ•ด๋ณด์„ธ์š”! ๐Ÿ”

10. ๋งˆ๋ฌด๋ฆฌ ๋ฐ ์ถ”๊ฐ€ ์ž๋ฃŒ ๐Ÿ“š

์ง€๊ธˆ๊นŒ์ง€ Spring Boot Actuator ์—”๋“œํฌ์ธํŠธ์˜ ๋ณด์•ˆ ์„ค์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”! ๋ณด์•ˆ์€ ํ•œ ๋ฒˆ์— ์™„์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ง€์†์ ์ธ ๊ด€๋ฆฌ์™€ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๊ณผ์ •์ด๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.

์ฃผ์š” ๋‚ด์šฉ ์š”์•ฝ

  1. Actuator๋Š” ๊ฐ•๋ ฅํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์ง€๋งŒ, ๋ณด์•ˆ์— ์‹ ๊ฒฝ ์จ์•ผ ํ•ด์š”.
  2. ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ๋งŒ ๋…ธ์ถœํ•˜๊ณ , ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์„ธ์š”.
  3. Spring Security๋ฅผ ํ†ตํ•ด ์ธ์ฆ๊ณผ ๊ถŒํ•œ์„ ์„ค์ •ํ•˜์„ธ์š”.
  4. IP ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œํ•œ, ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œํ•œ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜์„ธ์š”.
  5. ํ™˜๊ฒฝ๋ณ„๋กœ ์ ์ ˆํ•œ ๋ณด์•ˆ ์„ค์ •์„ ์ ์šฉํ•˜์„ธ์š”.
  6. ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€ ์—ฐ๋™ ์‹œ์—๋„ ๋ณด์•ˆ์„ ๊ณ ๋ คํ•˜์„ธ์š”.
  7. ์ •๊ธฐ์ ์œผ๋กœ ๋ณด์•ˆ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜์„ธ์š”.

Spring Boot Actuator์˜ ๋ณด์•ˆ ์„ค์ •์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ๋ณด์•ˆ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์—์š”. ํŠนํžˆ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋”์šฑ ์‹ ๊ฒฝ ์จ์•ผ ํ•ด์š”! ๐Ÿ˜Š

์ถ”๊ฐ€ ํ•™์Šต ์ž๋ฃŒ

  1. Spring Boot ๊ณต์‹ ๋ฌธ์„œ

    Spring Boot Actuator์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ •ํ™•ํ•˜๊ณ  ์ตœ์‹  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์š”.

  2. Spring Security ๊ณต์‹ ๋ฌธ์„œ

    Spring Security๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์š”.

  3. OWASP Top 10

    ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ์š” ๋ณด์•ˆ ์œ„ํ—˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์š”.

  4. Spring Boot in Action

    Spring Boot์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์š”.

  5. Cloud Native Spring in Action

    ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์šด์˜์— ๋Œ€ํ•ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์š”.

์žฌ๋Šฅ๋„ท์—์„œ๋„ Spring Boot์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ณด์•ˆ์— ๊ฐ•ํ•œ ๊ฐœ๋ฐœ์ž์˜ ๋„์›€์„ ๋ฐ›์•„ ๋” ์•ˆ์ „ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”! ๐Ÿš€

๋งˆ์น˜๋ฉฐ

Spring Boot Actuator๋Š” ์ •๋ง ์œ ์šฉํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋ณด์•ˆ์— ์†Œํ™€ํ•˜๋ฉด ํฐ ์œ„ํ—˜์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ์ด ๊ธ€์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ Actuator๋ฅผ ํ™œ์šฉํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

ํ˜น์‹œ ๋” ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ์งˆ๋ฌธํ•ด ์ฃผ์„ธ์š”. ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ€์š”! ๐Ÿ˜„

๊ทธ๋Ÿผ ๋‹ค์Œ์— ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์ฃผ์ œ๋กœ ์ฐพ์•„์˜ฌ๊ฒŒ์š”! ์•ˆ๋…•ํžˆ ๊ณ„์„ธ์š”~ ๐Ÿ‘‹

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.