운영 중 ISMS 심사 대응을 위해 application.yaml에 저장된 인증정보 암호화 작업을 진행했다.
기존에는 인증 계정, 업체 식별 정보 등이 설정 파일에 평문으로 저장되어 있었다.
auth:
id: admin
pw: password
ISMS 관점에서는 중요 정보가 평문으로 저장되어 있으면 안 되며, 암호화된 정보와 복호화 키 또한 분리 관리되어야 한다.
즉,
- 인증정보는 암호화 저장
- 복호화 키는 소스 또는 설정 파일에 저장 금지
- 암호문과 복호화 키를 별도 관리
구조를 갖춰야 한다.
적용 방식
Jasypt를 활용하여 설정 파일에는 암호문만 저장하고, 복호화에 필요한 마스터 키는 실행 환경에서 주입하도록 구성했다.
application.yaml
↓
ENC(암호문)
↓
Jasypt
↓
환경변수 또는 외부 설정
↓
복호화
↓
Spring Bean 주입
설정 파일이 유출되더라도 마스터 키가 없으면 복호화할 수 없는 구조다.
적용 내용
1. 의존성 추가
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
2. 암호화 대상 선정
인증 연동에 사용되는 주요 값을 암호화 대상으로 지정했다.
- id
- pw
3. 값 암호화
Jasypt CLI를 사용하여 암호문 생성
java -cp jasypt-1.9.3.jar \
org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
input='평문값' \
password='마스터키' \
algorithm=PBEWITHHMACSHA512ANDAES_256 \
ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
암호화 결과는 다음과 같이 적용했다.
auth:
id: ENC(...)
pw: ENC(...)
동일한 값을 암호화하더라도 랜덤 IV가 적용되기 때문에 매번 다른 암호문이 생성된다.
4. Jasypt 설정
jasypt:
encryptor:
algorithm: PBEWITHHMACSHA512ANDAES_256
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
암호화와 복호화 시 동일한 알고리즘을 사용해야 한다.
5. 마스터 키 외부 주입
마스터 키는 소스코드나 설정 파일에 저장하지 않는다.
로컬 개발 환경
export JASYPT_ENCRYPTOR_PASSWORD=마스터키
또는
./gradlew bootRun \
--args='--jasypt.encryptor.password=마스터키'
운영 환경
export JASYPT_ENCRYPTOR_PASSWORD='마스터키'
운영 서버에서는 zcode.conf에서 관리하고 서비스 기동 시 자동으로 로드하도록 구성했다.
6. 코드 적용
Jasypt가 애플리케이션 시작 시 자동으로 복호화를 수행하므로 기존 코드 수정은 최소화할 수 있었다.
@Value("${auth.id}")
private String authId;
@Value("${auth.pw}")
private String authPw;
실제 SOAP 호출 시 요청값이 없는 경우 복호화된 기본 인증값을 사용하도록 처리했다.
작업 중 발생한 이슈
1. zsh 암호화 명령 실행 오류
zsh: no such event
원인
암호 또는 입력값에 포함된 ! 문자를 zsh가 히스토리 확장 문자로 인식
해결
password='마스터키'
작은따옴표로 감싸서 실행
2. ENC 적용 후 서버 기동 실패
jasypt.encryptor.password must be provided
원인
암호문은 존재하지만 복호화 키가 전달되지 않음
해결
환경변수 또는 실행 인자를 통해 마스터 키 전달
결과적으로 암호화가 정상 적용되었음을 확인할 수 있었다.


3. Gradle Build 실패
contextLoads() failed
원인
테스트 컨텍스트에서도 ENC 값을 읽으며 복호화를 시도
해결
./gradlew build -x test
또는
- 테스트용 환경변수 주입
- 테스트 전용 설정 분리
4. 로그 중복 적재
원인
- service.sh 로그 파일
- logback FILE Appender
두 곳에서 동일 파일에 기록
해결
FILE Appender 제거 후 CONSOLE 출력만 유지
service.sh 로그로 일원화
정리
이번 작업의 핵심은 단순히 값을 암호화하는 것이 아니라, 암호문과 복호화 키를 분리 관리하는 구조를 만드는 것이었다.
설정 파일에는 암호문만 저장하고, 마스터 키는 운영 환경에서 외부 주입하도록 구성함으로써 ISMS 요구사항을 충족할 수 있었다.
결과적으로 기존 기능 변경 없이 보안 수준을 향상시키고, 설정 파일 유출 시에도 인증정보가 노출되지 않는 구조를 적용할 수 있었다.
'프로그래밍 언어 > JAVA(JSP, Spring)' 카테고리의 다른 글
| IntelliJ에서 Java 클래스 생성 버튼이 안 보이는 이유 — 소스 루트(Source Root) 설정법 (0) | 2026.04.06 |
|---|---|
| Spring Boot 3.x 빌드 에러 해결 — "Dependency requires at least JVM runtime version 17" 원인과 해결법 (0) | 2026.04.04 |
| Spring Boot가 꺼졌는데 왜 포트는 안 풀려요? (0) | 2026.04.02 |
| Spring Boot 빌드 도구 완전 정리 | Gradle vs Maven 차이점과 선택 기준 (0) | 2026.03.29 |
| JPA vs MyBatis 핵심 차이점, 사용 방식, 용도 완벽 정리 (0) | 2025.11.20 |