2021. 11. 15. 17:16ㆍSpring 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 |
---|