
๐ฑ Spring Boot - Jasypt
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ค ๋ฏผ๊ฐํ ์ ๋ณด(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด, API ํค, ๋น๋ฐ๋ฒํธ ๋ฑ)๋ฅผ ๊ด๋ฆฌํ๋ ์ผ์ ๋ณด์์ ํต์ฌ ์์์ด๋ค. ํ์ง๋ง ์ด๋ฐ ์ ๋ณด๋ฅผ ํ๋ฌธ์ผ๋ก ์ค์ ํ์ผ์ ์ ์ฅํ๋ฉด ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด **Jasypt(Java Simplified Encryption)**๋ฅผ ์ฌ์ฉํ ์ ์๋ค. Jasypt๋ Spring Boot์ ์ฝ๊ฒ ํตํฉ๋์ด ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ํธํํ๊ณ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๊ฐ๋จํ๋ฉด์๋ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ค.
Jasypt
Jasypt(Java Simplified Encryption)์ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํธํ ๋ฐ ๋ณตํธํ๋ฅผ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ํนํ Spring Boot์ ํตํฉํ๋ฉด ์ค์ ํ์ผ์ ํฌํจ๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ ์ํ๋ก ์ ์ฅํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์๋์ผ๋ก ๋ณตํธํํ ์ ์๋ค.
Jasypt์ ์ฃผ์ ํน์ง:
- AES, PBE ๋ฑ ๋ค์ํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ ์ง์
- ์ค์ ํ์ผ์ ํฌํจ๋ ์ํธํ๋ ๋ฐ์ดํฐ ์๋ ๋ณตํธํ
- ๊ฐ๋จํ ์ค์ ๊ณผ ์ฌ์ฉ๋ฒ
Jasypt ์ค์ ํ๊ธฐ
์์กด์ฑ ์ถ๊ฐ
build.gradle์ ์์กด์ฑ์ ์ถ๊ฐํ ํ ํ๋ก์ ํธ ๋น๋
dependencies {
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
}
Jasypt ์ค์ ํด๋์ค ์์ฑ
@Configuration
@Slf4j
public class JasyptConfig {
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
// ์ํธํ ํค ์ค์ : ํ๊ฒฝ ๋ณ์ ๋๋ ์์คํ
์์ฑ์์ ์ฝ์
String encryptionKey = System.getenv("JASYPT_ENCRYPTOR_PASSWORD");
if ( StringUtils.isBlank(encryptionKey) ) {
throw new IllegalStateException("JASYPT_ENCRYPTOR_PASSWORD ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.");
}
// Jasypt ์ํธํ ๊ธฐ๋ณธ ์ค์
config.setPassword(encryptionKey);
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
log.info("Jasypt StringEncryptor๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ค์ ๋์์ต๋๋ค.");
return encryptor;
}
}
config.setPassword(encryptionKey)
์ํธํ/๋ณตํธํ๋ฅผ ์ํ ๋น๋ฐ ํค๋ฅผ ์ค์ ํ๋ค. ์ด ํค๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ํธํํ ๋ ์ฌ์ฉ๋๋ฉฐ, ๋์ผํ ํค๊ฐ ์์ด์ผ ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ๋ค.
์ค์์ฌํญ:
- ์์ ํ ํ๊ฒฝ ๋ณ์๋ ์ธ๋ถ ๋น๋ฐ ๊ด๋ฆฌ ์๋น์ค๋ฅผ ์ฌ์ฉํด ๊ด๋ฆฌ
- ์ด ๊ฐ์ ์์ค ์ฝ๋์ ์ง์ ํฌํจ x
config.setAlgorithm("PBEWithMD5AndDES")
์ํธํ์ ์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ ํ๋ค. ์ฌ๊ธฐ์ PBEWithMD5AndDES๋ Password-Based Encryption(PBE) ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, MD5 ํด์ฑ๊ณผ DES(Data Encryption Standard)๋ฅผ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ๊ฐ: Jasypt์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ PBEWithMD5AndDES
๋ค๋ฅธ ์ต์ :
- PBEWithSHA256And128BitAES-CDC-BC (๋ ์์ ํ ์๊ณ ๋ฆฌ์ฆ)
- PBEWithSHA256And192BitAES-CDC-BC
๊ฐ๋ฅํ๋ฉด ๋ ๊ฐ๋ ฅํ ์๊ณ ๋ฆฌ์ฆ(AES ๊ธฐ๋ฐ)์ ๊ถ์ฅํ๋ค.
config.setKeyObtentionIterations("1000")
์ํธํ ํค๋ฅผ ์์ฑํ ๋ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ฉํ ํด์ฑ์ ํ์๋ฅผ ์ค์ ํ๋ค. ๋ฐ๋ณต ํ์๊ฐ ๋ง์ ์๋ก ์ํธํ๋ ๋ ์์ ํ์ง๋ง, ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค.
๊ธฐ๋ณธ๊ฐ: 1000
์ถ์ฒ ๊ฐ: ๋ณด์์ ๊ฐํํ๋ ค๋ฉด 10000 ์ด์์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
์ฃผ์: ๋๋ฌด ๋์ ๊ฐ์ ์ค์ ํ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
config.setPoolSize("1")
์ํธํ/๋ณตํธํ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ ์ค๋ ๋ ํ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค.
๊ธฐ๋ณธ๊ฐ: 1
์ถ์ฒ ๊ฐ: ์ผ๋ฐ์ ์ผ๋ก 1๋ก ์ค์ ํ์ง๋ง, ๋์ ํธ๋ํฝ ํ๊ฒฝ์์๋ ๋ ํฐ ๊ฐ์ ์ค์ ํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค.
์ฃผ์: ๋๋ฌด ํฐ ๊ฐ์ ์ค์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์๋ค.
config.setProviderName("SunJCE")
์ํธํ ์์ ์ ์ฌ์ฉํ JCE(Java Cryptography Extension) ์ ๊ณต์๋ฅผ ์ง์ ํ๋ค.
๊ธฐ๋ณธ๊ฐ: SunJCE (Java์ ๊ธฐ๋ณธ ์ ๊ณต์)
๋ค๋ฅธ ์ต์ :
- BC (Bouncy Castle ์ํธํ ์ ๊ณต์)์ ๊ฐ์ ์ธ๋ถ ์ ๊ณต์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- Bouncy Castle์ ๋ ๋น์ผํ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๋ฏ๋ก ํ์์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์๋ค.
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator")
์ํธํ์ ์ฌ์ฉํ Salt(๋์)๋ฅผ ์์ฑํ๋ ํด๋์ค ์ด๋ฆ์ ์ค์ ํ๋ค. Salt๋ ๋์ผํ ๊ฐ์ด ์ํธํ๋๋๋ผ๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋๋ก ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ: RandomSaltGenerator
๋ค๋ฅธ ์ต์ :
- ZeroSaltGenerator: Salt๋ฅผ ์ฌ์ฉํ์ง ์์ (๋ณด์์ฑ์ด ๋จ์ด์ง)
- FixedSaltGenerator: ๊ณ ์ ๋ Salt ์ฌ์ฉ (ํ ์คํธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ)
์ผ๋ฐ์ ์ผ๋ก RandomSaltGenerator๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ๋ค.
config.setStringOutPutType("base64")
์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ํ์์ผ๋ก ์ถ๋ ฅํ ์ง ์ค์ ํ๋ค.
๊ธฐ๋ณธ๊ฐ: base64 (์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ base64 ํ์์ผ๋ก ์ถ๋ ฅ. ์ฌ๋์ด ์ฝ์ ์ ์๋ ํํ๋ก ํ์ผ ์ ์ฅ์ ์ ์ฉ)
๋ค๋ฅธ ์ต์ :
- hexadecimal: ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ 16์ง์ ํ์์ผ๋ก ์ถ๋ ฅ
์ํธํ ํค ์ค์
Jasypt๋ ์ํธํ ํค๊ฐ ํ์ํ๋ค. ์ด ํค๋ ๋ณด์์ ํต์ฌ์ด๋ฏ๋ก, ๋ฐ๋์ ์์ ํ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
ํ๊ฒฝ ๋ณ์๋ก ์ค์ (์ถ์ฒ)
Window
set JASYPT_ENCRYPTOR_PASSWORD=your-secret-key
Linux/Mac
export JASYPT_ENCRYPTOR_PASSWORD=your-secret-key
๋ช ๋ น์ค ์ธ์๋ก ์ ๋ฌ
java -Djasypt.encryptor.password=your-secret-key -jar your-app.jar
Jasypt ์ฌ์ฉํ Datasource ์ํธํ ์ค์ ์์ธ
[ Spring Boot ] Spring Boot์์ Datasource ์ํธํํ๊ธฐ
๐ฑ Spring Boot - Datasource ์ํธํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ํฌํจํ spring.datasource.url, spring.datasource.username, spring.datasource.password๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋ฏผ๊ฐ ์ ๋ณด ์ค ํ๋์ด๋ค. ์ด ์ ๋ณด๊ฐ ์ธ๋ถ๋ก ๋ ธ
euntry.tistory.com
'Back-end > JAVA & Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ Spring Security ] ๋์ URL ์ ๊ทผ ๊ถํ ์ ์ด ๊ตฌํ (1) | 2025.04.04 |
|---|---|
| [ Spring Boot ] Spring Boot์์ Datasource ์ํธํํ๊ธฐ (1) | 2025.01.16 |
| [ Spring Boot ] Banner ๋ณ๊ฒฝ (1) | 2024.12.24 |
| [ Spring ] application.properties ๊ฐ๋ฐ์ ์ ์ ๊ฒฝ๊ณ ํด๊ฒฐ (1) | 2024.11.25 |
| [ Spring ] batch ์ค์ผ์ค๋ง ๊ธฐ๊ฐ ์ค์ (3) | 2024.10.08 |