Application Servers & Java

Tomcat 데이터소스 암호화 적용 예제 (AES 기반)

midworker 2025. 5. 15. 19:02
반응형

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로 암호화한 문자열 입력

✅ 적용 및 빌드

  1. Encryptor.java, EncryptedDataSourceFactory.java를 컴파일
  2. /tomcat/lib/ 또는 /WEB-INF/classes/에 배포
  3. context.xml에 JNDI 설정 적용
  4. 서버 재기동

✅ 보안 주의 사항

  • 암호화 키(defaultSecretKey)는 별도 파일 또는 환경변수로 관리하는 것이 안전합니다.
  • Encryptor는 기본 AES/128bit 기반이며, JCE 제한 해제나 고급 키 관리가 필요할 수 있습니다.
  • 암호화 로직은 외부 접근이 제한된 클래스 경로 내에 위치해야 합니다.

✅ 마무리

이 방식은 Tomcat에 적용할 수 있는 가장 기본적이고 심플한 DB 비밀번호 암호화 방식입니다.
보안 요구 수준에 따라 Vault 방식, KeyStore 연동, 또는 JCE/JCEKS 기반 키관리 방식으로 확장 가능합니다.


반응형