반응형
Tomcat 데이터소스 암호화 적용 예제 (AES 기반)
보안이 중요한 환경에서는 Tomcat의 context.xml
이나 server.xml
에
DB 비밀번호를 평문으로 작성하는 대신 암호화된 문자열을 등록하고, 복호화 로직으로 처리하는 방식이 필요합니다.
이번 글에서는 Tomcat JDBC 커넥션 풀(DataSourceFactory
)을 확장하여
AES 암호화를 적용하는 예제를 소개합니다.
✅ 1. 구성 개요
구성 요소 | 설명 |
---|---|
EncryptedDataSourceFactory.java |
Tomcat 기본 DataSourceFactory 를 상속한 사용자 정의 클래스 |
Encryptor.java |
AES 방식으로 암/복호화를 수행하는 유틸 클래스 |
context.xml |
암호화된 비밀번호를 포함한 JNDI 데이터소스 설정 파일 |
✅ 2. 암호화 클래스 (Encryptor.java)
- AES 알고리즘을 사용한 암/복호화 수행
- secretKey는 고정 또는 외부에서 전달 가능
- 메인 함수 실행 시 평문 → 암호문 생성 가능
public class Encryptor {
private static final String ALGORITHM = "AES";
private static final String defaultSecretKey = "ThisIsAVeryVerySecretKey";
private Key secretKeySpec;
public Encryptor() { ... }
public Encryptor(String secretKey) { ... }
public String encrypt(String plainText) { ... }
public String decrypt(String encryptedString) { ... }
public static void main(String[] args) throws Exception {
// 암호화 테스트
String encrypted = new Encryptor().encrypt("your_db_password");
System.out.println(encrypted);
}
}
✅ 이 클래스는 JDK 기본 API로 동작하며 외부 라이브러리 불필요
✅ 3. 사용자 정의 DataSourceFactory
public class EncryptedDataSourceFactory extends DataSourceFactory {
private Encryptor encryptor = new Encryptor();
@Override
public DataSource createDataSource(Properties properties, Context context, boolean XA) {
PoolConfiguration poolProperties = parsePoolProperties(properties);
poolProperties.setPassword(encryptor.decrypt(poolProperties.getPassword()));
return XA ? new XADataSource(poolProperties) : new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
}
}
createDataSource()
오버라이딩- 설정된 암호화된 비밀번호 → 복호화 후 Pool에 전달
✅ 4. context.xml 설정 예
<Context>
<Resource name="jdbc/mydb"
auth="Container"
type="javax.sql.DataSource"
factory="com.cywell.EncryptedDataSourceFactory"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:XE"
username="scott"
password="encrypted_string_here"
maxActive="50"
maxIdle="10"
maxWait="10000"/>
</Context>
- factory 속성에
EncryptedDataSourceFactory
지정 password
는 Encryptor로 암호화한 문자열 입력
✅ 적용 및 빌드
Encryptor.java
,EncryptedDataSourceFactory.java
를 컴파일/tomcat/lib/
또는/WEB-INF/classes/
에 배포context.xml
에 JNDI 설정 적용- 서버 재기동
✅ 보안 주의 사항
- 암호화 키(
defaultSecretKey
)는 별도 파일 또는 환경변수로 관리하는 것이 안전합니다. Encryptor
는 기본 AES/128bit 기반이며, JCE 제한 해제나 고급 키 관리가 필요할 수 있습니다.- 암호화 로직은 외부 접근이 제한된 클래스 경로 내에 위치해야 합니다.
✅ 마무리
이 방식은 Tomcat에 적용할 수 있는 가장 기본적이고 심플한 DB 비밀번호 암호화 방식입니다.
보안 요구 수준에 따라 Vault 방식, KeyStore 연동, 또는 JCE/JCEKS 기반 키관리 방식으로 확장 가능합니다.
반응형
'Application Servers & Java' 카테고리의 다른 글
JBoss 장애 사례: MIME 업로드, 라이브러리 중복, 네트워크 연동 오류 (0) | 2025.05.15 |
---|---|
JBoss 장애 사례: 문자 인코딩, 클러스터, 포트 설정 이슈 (0) | 2025.05.15 |
[장애 사례] WebLogic JDBC 커넥션 풀 초기화 실패 - Access Denied for MySQL 사용자 (0) | 2025.05.15 |
[장애 사례] WebLogic SSL 연동 오류 및 HTTPS 비정상 대응 (0) | 2025.05.15 |
[장애 사례] java.net.SocketException: Too many open files (0) | 2025.05.15 |