본 글에서는 java에서 제공하는 암호화관련 기본 라이브러리인 jasypt를 활용하여, DB관련 접속정보들을 암호화해보겠습니다.
이전 글에서 spring으로 mongodb를 연결하여 컬렉션에 저장된 데이터를 불러오는 api를 간단히 작성하였습니다.
Spring Data JPA 쿼리메서드 방식으로 mongoDB연계
Spring Data JPA 쿼리메서드 방식으로 MongoDB 연계
본 글에서는 Spring Data JPA에서 주로 사용하는 쿼리메서드 방식을 통해, Repository 인터페이스에 간단한 네이밍룰을 통해 CRUD 중 R을 구현하여, MongoDB에 저장된 데이터를 간단하게 불러오는 예제를
dnl1029.tistory.com
이전 글을 통해 mongoDB url을 github에push하였더니, 이러한 메일이 왔습니다. mongoDB의 uri가 그대로 노출되어 수정이 필요하다는 내용으로 보여, uri값을 암호화해보는 것이 이번 글의 목표입니다.
application.yml에 아래와 같이 추가된 mongodb uri를 암호화해보겠습니다.
spring:
data:
mongodb:
uri: mongodb+srv://admin:내암호@cluster0.1p17esk.mongodb.net/sample_airbnb
- pom.xml
: 의존성에 아래와 같이 jasypt 의존성을 추가해줍니다.
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
- key.properties
: 아래와 같이 암호화/복호화에 쓰일 jasypt key를 작성합니다.
jasypt.key=jasypt_testkey
- Config
: Config 폴더내에 아래와같은 JasyptConfig 파일을 추가합니다. @PropertySource 어노테이션을통해key.properties의 파일 위치를 지정해줍니다. 알고리즘은 default로 "PBEWithMD5AndDes"를 사용하고, key값이 중요한데, 암호화 된 값을 복호화할때 key값이 틀린경우, 에러가 나게되니 주의해야합니다.
@Configuration
@PropertySource("classpath:key.properties") // src/main/resources/key.properties 참조
public class JasyptConfig {
@Value("${jasypt.key}")
private String key;
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(key); //암호화, 복호화에 사용할 키
config.setAlgorithm("PBEWithMD5AndDes"); //암호화에 사용할 알고리즘
config.setKeyObtentionIterations("1000"); // 반복할 해싱 횟수
config.setPoolSize("1"); //인스턴스 풀
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
- test파일 작성
: junit 테스트를 통해, 암호화할 String 문자열의 출력값을 확인해봅시다. mongo uri의 암호화된값(enc_mongourl)이 로그에 찍히는걸 확인후, application-yml 를 향후에 수정해줄겁니다.
@SpringBootTest
@Slf4j
public class JasyptConfigTest {
@Autowired
@Qualifier("jasyptStringEncryptor")
StringEncryptor encryptor;
@Test
void test() {
String a = "jasypt_testkey";
String enc1 = encryptor.encrypt(a);
log.info("en1 : {}",enc1);
String dec1 = encryptor.decrypt(enc1);
log.info("dec1 : {}",dec1);
String mongourl = "mongodb+srv://admin:내암호@cluster0.1p17esk.mongodb.net/sample_airbnb";
String enc_mongourl = encryptor.encrypt(mongourl);
log.info("enc_mongourl = {}",enc_mongourl);
String dec_mongourl = encryptor.decrypt(enc_mongourl);
log.info("dec_mongourl = {}",dec_mongourl);
}
}
- test파일 실행결과
이제 최종적으로 application.yml에 있는 uri을 수정해주었습니다. 암호화된 값을 ENC() 안에 넣어주면, 알아서 복호화해줍니다.
- application.yml
spring:
data:
mongodb:
# uri: mongodb+srv://admin:내암호@cluster0.1p17esk.mongodb.net/sample_airbnb
uri: ENC(0SnlEp7/SSx0nLKoc/C/llcfIA0kLWMOEjgjQti0Flz3YkATfsccYzfVV85spC8hKR13+Qaqie7J+fEboO9SZJbvpl25+AKglOaySUNc8p+oCTewkW4Jkw==)
그런데 아래와 같이 Failed to load ApplicationContext 오류가 뜹니다.
해결방법을 한참 찾았는데, JasyptConfig 파일에 @EnableEncryptableProperties 어노테이션을 추가하니, 정상적으로 에러가 없어졌습니다.
@Configuration
@PropertySource("classpath:key.properties") // src/main/resources/key.properties 참조
@EnableEncryptableProperties
public class JasyptConfig {
혹은 MainApplication 파일에 @EnableEncryptableProperties 어노테이션을 추가해도 가능합니다.
@SpringBootApplication
@EnableFeignClients
@EnableEncryptableProperties
public class BlogApplication {
public static void main(String[] args) {
SpringApplication.run(BlogApplication.class, args);
}
}
이제 정상적으로 BlogApplication 구동후, MongoDB에서 특성name을 파라미터로 하는 get api 요청을 날려보겠습니다.
- 결과
'spring' 카테고리의 다른 글
spring jwt 토큰 발급하는 restapi 만들기 (1) | 2023.06.25 |
---|---|
spring mybatis로 RDB select 해보기 (0) | 2023.06.25 |
spring graceful shutdown (0) | 2023.06.25 |
spring bean 초기화, 소멸(lifecycle) (0) | 2023.06.25 |
Spring Data JPA 쿼리메서드 방식으로 MongoDB 연계 (0) | 2023.06.04 |
spring RequestBodyAdviceAdapter를 통한 apiKey 인증인가 적용 (0) | 2023.06.04 |
spring Filter에 @RequestBody 불러오기 / apiKey 인증인가 적용 (0) | 2023.06.04 |
spring 파라미터와 Request정보가 같이 필요할 때 처리방법 (1) | 2023.05.20 |
댓글