| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 스레드 덤프
- java
- 오블완
- JDBC
- wsdl
- Docker
- oracle
- 삼성증권
- http
- Linux
- ibatis
- integer
- 컨트롤러
- Database
- 영상편집
- 프로세스
- cmd
- 스레드
- HTML
- START WITH
- MariaDB
- Tomcat
- 티스토리챌린지
- 톰캣
- 키보드
- 안드로이드 스튜디오
- letterspacing
- MySQL
- equals
- API
- Today
- Total
블로그 이름
[JAVA] JMX 인증 설정 정리 본문
Spring Boot / 순수 Java 어플리케이션 운영 시 JMX 보안 설정 및 오류 해결 방법을 정리하고자 한다.
1. JMX 인증 설정
jmx.id=xxx, jmx.pw=yyy 와 같이 프로퍼티로 설정하는 것이 아님
JMX 인증은 application.properties 에 ID/PW 를 쓰는 게 아닌 연결 시 ID/PW 를 사용하는 것이며, JMX 인증은 JVM 레벨에서 설정하며 ID/PW는 반드시 파일로 관리해야 한다.
JMX 기본 설정 (Windows 기준)
com.sun.management.jmxremote=true
com.sun.management.jmxremote.port=1099
com.sun.management.jmxremote.rmi.port=1099
com.sun.management.jmxremote.authenticate=true
com.sun.management.jmxremote.ssl=false
com.sun.management.jmxremote.password.file=C:/app/jmx/jmxremote.password
com.sun.management.jmxremote.access.file=C:/app/jmx/jmxremote.access
경로의 경우 절대경로를 권장하나 상대경로로 사용은 가능하다 (./app/jmx/jmxremote.password)
jmxremote.password 파일
monitorRole monitor123
controlRole control123
- 앞: ID (Username)
- 뒤: 비밀번호 (Password)
계정 권한 설정
jmxremote.access
monitorRole readonly
controlRole readwrite
계정 권한의 경우 readonly, readwrite 가 존재하며 readonly를 사용하는 경우 조회만 가능 (내 프로그램의 경우 켜지지 않는 것으 readwrite 사용 필요하다 왜인지 추후 확인 필요)
| monitorRole | 조회만 가능 |
| controlRole | GC, HeapDump, 설정 변경 가능 |
위와 같이 설정한 다음 프로그램을 실행하면, 아래와 같은 오류 발생
java.lang.SecurityException: 비밀번호 파일 읽기 액세스는 제한되어야 합니다
원인은 JMX 비밀번호 파일 권한이 너무 열려있는 것. Linux의 chmod 600을 Windows 보안 권한으로 흉내내야한다. jmxremote.password 우크릭 -> 속성 -> 보안 탭 -> 고급 -> 상속 사용 안 함 -> 상속된 권한 제거 -> 계정 전체 삭제 후, administrators 혹은 Java 실행 계정 1개 추가하여 읽기 권한만 부여
jmxremote.access 파일도 동일하게 설정하여 파일 권한 설정해주어 오류 해결하였다.
두 번째 에러
java.lang.SecurityException: Access denied! Invalid access level
원인은 readonly 계정으로 write 작업을 시도하여 발생. 권한이 readwrite인 계정으로 접속하면 해결된다.
JMX ID/PW 적용 여부 확인 방법은
CMD -> jconsole 입력 시 아래와 같은 화면이 표시된다.

해당 RemoteProcess 선택 후 host에는 localhost:9999 와 같이 접속할 IP:PORT 입력, UserName/Password 입력 후 접속해보면 된다. 맞는 NAME/PW로 입력 시 연결이 된다면 성공이다.
'개발 > Java' 카테고리의 다른 글
| [Java] 배열 내 존재여부 확인 시 List와 Set 동작방식 및 성능 차이 (0) | 2025.12.16 |
|---|---|
| [JAVA] 스레드 덤프 출력 및 분석 (데드락, 무한루프) (0) | 2025.11.16 |
| [JAVA] Integer 비교 시 ==가 아닌 equals() 를 사용하는 이유 (0) | 2025.08.31 |
| [JAVA] 객체의 메모리 크기 확인 방법 (1) | 2025.08.03 |
| [Java] Java 임시파일 경로 설정하기 (1) | 2025.06.09 |