context-datasource.xml 위치, context-datasource.xml 암호화

context-datasource.xml 위치, context-datasource.xml 암호화

마이바티스(Mybatis)를 사용할 때 context-datasource.xml 안에 데이터베이스(DB) URL, 포트, 아이디, 비밀번호를 적어넣게 된다.

아래와 같은 형태다.

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
 xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd“>
    <bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>
         <property name=”driverClassName” value=”com.mysql.jdbc.Driver” />
         <property name=”url” value=”jdbc:mysql://아이피주소:포트/디비명” />
         <property name=”username” value=”아이디” />
         <property name=”password” value=”비밀번호” />
    </bean>
</beans>

이 경우 치명적인 단점이 있는데 GitHub 등에 커밋할 경우 아이디나 비밀번호가 유출될 수 있다는 점이다.

물론 해당 파일을 싱크로나이즈 대상에서 제외시킬 수도 있겠지만 실수할 가능성이 존재한다.

따라서 context-datasource.xml 안에 암호화된 값을 기입해놓거나, 일단 의미없는 값을 넣어놓고 변경하는 방법을 소개한다.

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
 xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd“>
 <!–bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”–>
 <bean id=”dataSource” class=”com.thkmon.webstd.db.NewDataSource” destroy-method=”close”>
 <property name=”driverClassName” value=”com.mysql.jdbc.Driver”/>
 <property name=”url” value=”1″/>
 <property name=”username” value=”1″/>
 <property name=”password” value=”1″/>
 </bean>
</beans>

context-datasource.xml 파일에서 BasicDataSource 클래스명이 들어있는 라인(<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>)을 주석처리하고, 그 아래에

<bean id=”dataSource” class=”com.thkmon.webstd.db.NewDataSource” destroy-method=”close”> 라는 라인을 추가한다.

경로는 달라져도 좋으나, 해당 경로의 패키지와 클래스를 새로 생성해야 한다.

여기서 com.thkmon.webstd.db 패키지는 필자가 직접 만든 패키지이고, NewDataSource 클래스도 새로 만든 클래스이다.

context-datasource.xml 파일의 url, username, password 에는 암호화된 값 또는 의미없는 값을 넣어둔다.

이어서 com.thkmon.webstd.db 패키지를 만들고, 해당 패키지 안에 NewDataSource.class 파일을 추가한다.

내용은 아래와 같이 작성한다. (BasicDataSource 를 상속)

package com.thkmon.webstd.db;

import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;

public class NewDataSource extends BasicDataSource {

    public synchronized void close() throws SQLException {
        super.close();
    }
 
    public synchronized void setDriverClassName(String driverClassName) {
        super.setDriverClassName(driverClassName);
    }

    public synchronized void setUrl(String url) {
        String newUrl = “jdbc:mysql://아이피주소:포트/디비명”;
        super.setUrl(newUrl);
    }

    public void setUsername(String username) {
        String newUsername = “newUserName”;
        super.setUsername(newUsername);
    }

    public void setPassword(String password) {
        String newPassword = “newPassword”;
        super.setPassword(newPassword);
    }
}

BasicDataSource 클래스를 상속하였으므로 setUrl, setUsername, setPassword 등이 오버라이딩 되어 있다.

위 예제에서는 문자열 값이 하드코딩되어 있는데 그래서는 의미가 없고, 메서드 내용을 적절히 변경하면 된다.

첫번째 방법으로는, context-datasource.xml 쪽에는 의미없는 값을 넣어두고, setUrl, setUsername, setPassword 메서드 안에서는 특정 위치의 설정 파일(properties, config, xml 등)을 읽어들여서 그 안의 값으로 변경한다.

다른 방법으로는, context-datasource.xml 쪽에 암호화된 값을 넣어두고, setUrl, setUsername, setPassword 메서드 안에서 복호화를 수행하여 처리하면 된다. 암복호화 로직은 여기서 따로 설명하지 않는다.

자세한 것은 [JAVA] AES128 암호화 예제(https://blog.naver.com/bb_/221332286531)를 참고할 것.