Spring Security 암호화된 properties 값 읽기

2021. 11. 15. 17:16Spring MVC

/WEB-INF/spring/appServlet/props-context.xml

Mybatis, JPA 등에서 DB 접속을 할때, username 과 password 를 소스코드에 노출하지 않도록 하기 위하여

/WEB-INF/props/db.properties 파일에 다음과 같이 암호화된 값을 저장하고

# MySQL DB 연결 설정
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mydb
db.username=ENC(vZ1EHcJ1UU2VgmR3y/fSgrJSAaqwvZQN)
db.password=ENC(K2pud5bNn4Jse4jMckK15XzQJhIy/yrN2ScBeBCafYc=)

 

dbconn-context.xml 에서 EncryptablePropertyPlaceholderConfigurer 를 통과하여

암호화된 username 과 password 를 encrypt 하여 DB 접속정보로 사용한다.

 

많은 예제들이 인터넷에 있으므로 코드에 대한 설명은 언급하지 않겠다

 

<bean id="envConfig" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
    <property name="algorithm" value="PBEWithMD5AndDES"/>
    <property name="passwordEnvName" value="myname"/>
</bean>

<bean id="encConvert" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
    <property name="config" ref="envConfig"/>
</bean>
<bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
    <constructor-arg ref="encConvert"/>
    <property name="locations">
        <list>
            <value>/WEB-INF/spring/props/db.properties</value>
        </list>
    </property>
</bean>

<!-- dataSource -->
<bean id="ds" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="${db.driver}"/>
    <property name="url" value="${db.url}"/>
    <property name="username" value="${db.username}"/>
    <property name="password" value="${db.password}"/>
</bean>

 

프로젝트에서 db.properties 등에 저장된 값을 Java 코드에서 사용할 일이 생겼다

일반적인 properties 들은 다음과 같이 설정하고,

<context:property-placeholder location="/WEB-INF/spring/props/db.properties" />

Java class 에서 다음과 같이 참조할 수 있다. username 변수에는 복호화된 username 정보가 담기게 된다

@Value("${db.username}")
private String username;

 

Java 코드에서 정상적으로 읽혀야 할 변수값이 ${db.username} 이라는 문자열로 읽힌다

 

1. 원인 : context 파일의 위치가 root-context 영역에 설정되어 있다.

spring security 와 연동하기 위해 root-context 영역에 설정을 하였는데, 이 설정을 Java code 에서 인식하지 못한다.

 

/WEB-INF/spring/db-context.xml

여러가지 원인이 있겠지만, 아무튼 다음과 같은 방법으로 해결했다.

servlet-context 영역에 context.xml 파일을 생성하고

/WEB-INF/spring/appServlet/props-context.xml

EncryptablePropertyPlaceholderConfigurer 를 한번더 설정해 준다.

encConvert bean 은 root-context 에 설정된 것을 잘 참조하여 코드가 정상으로 수행된다

<bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
    <constructor-arg ref="encConvert"/>
    <property name="locations">
        <list>
            <value>/WEB-INF/spring/props/db.properties</value>
        </list>
    </property>
</bean>

 

좀더 좋은 방법이 있을지 고민해 본다

'Spring MVC' 카테고리의 다른 글

Gradle 로 Spring Legacy  (0) 2021.11.27