이 오류는 이름 그대로 **”암호화/복호화 작업을 수행할 수 없다”**는 의미이며, 원인은 거의 대부분 암/복호화 키(Secret Key)가 일치하지 않거나, Jasypt 설정이 제대로 적용되지 않았기 때문입니다.
원인 1: 비밀 키(Secret Key) 불일치 (가장 흔한 원인)
가장 가능성이 높은 원인입니다. 값을 암호화할 때 사용한 키와 애플리케이션이 복호화하려고 할 때 사용하는 키가 서로 다른 경우입니다. 공백 하나, 대소문자 하나만 달라도 이 예외가 발생합니다.
✅ 해결 방법:
- 키 재확인:
application.properties에 암호화된 값을 생성할 때 사용했던 비밀 키를 다시 한번 정확히 확인합니다.- 애플리케이션을 실행할 때 주입하는 환경 변수 또는 JVM 옵션의 키 값과 글자 하나하나 완벽하게 일치하는지 비교합니다. (복사/붙여넣기를 추천합니다.)
- 새로운 값으로 암호화 및 적용:
- 가장 확실한 방법은, 현재 실행 환경에 설정된 비밀 키를 사용하여 값을 다시 암호화하는 것입니다.
- 2단계: JVM 옵션으로
-Djasypt.encryptor.password="my-real-secret-key"를 설정하고 앱을 실행합니다. - 3단계: 온라인 암호화 도구나 Java 코드를 사용하여,
my-real-secret-key를 비밀번호로 넣고 평문을 암호화합니다. - 4단계: 새로 생성된 암호화된 값을 복사하여
application.properties의ENC(...)안에 붙여넣고 다시 실행합니다.
원인 2: Jasypt가 비밀 키를 찾지 못하는 경우
애플리케이션이 시작될 때 Jasypt가 비밀 키를 어디서 읽어와야 할지 몰라서 복호화를 시도조차 못 하는 경우입니다.
✅ 해결 방법:
application.properties에 비밀 키 경로 명시:- 가장 명확한 방법은
application.properties파일에 Jasypt가 비밀 키를 어디서 가져와야 하는지 알려주는 것입니다. 이렇게 하면 설정이 코드에 명시적으로 드러나 관리가 편합니다.
properties1234<span class="line"><span># application.properties</span></span><span class="line"><span></span></span><span class="line"><span># Jasypt가 JASYPT_ENCRYPTOR_PASSWORD라는 이름의 환경 변수에서 비밀 키를 읽어오도록 설정</span></span><span class="line"><span>jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD}</span></span>- 가장 명확한 방법은
- 환경 변수 또는 JVM 옵션 이름 확인:
- Jasypt는 기본적으로
jasypt.encryptor.password라는 이름의 프로퍼티를 찾습니다. - 환경 변수로 설정할 때는 대문자와 언더스코어를 사용하여
JASYPT_ENCRYPTOR_PASSWORD로 설정해야 Spring Boot가 이를jasypt.encryptor.password로 올바르게 변환하여 인식합니다. - JVM 옵션으로 설정할 때는
-Djasypt.encryptor.password="your-key"처럼 소문자와 점을 사용해야 합니다.
- Jasypt는 기본적으로
원인 3: Jasypt 설정 클래스(JasyptConfig)의 오류
JasyptConfig.java와 같은 설정 클래스를 직접 만들어서 사용하는 경우, 이 클래스의 설정이 암호화 시 사용된 설정과 다를 때 예외가 발생할 수 있습니다.
✅ 해결 방법:
- 알고리즘 일치 확인:
JasyptConfig클래스에서config.setAlgorithm(...)으로 설정한 알고리즘이 암호화할 때 사용한 알고리즘과 동일한지 확인해야 합니다.- Jasypt의 기본 알고리즘은
PBEWithMD5AndDES입니다. 만약 암호화 시 기본값으로 해놓고, 설정 클래스에서는 다른 알고리즘(예:PBEWithHMACSHA512AndAES_256)을 사용했다면 당연히 복호화에 실패합니다. - 특별한 이유가 없다면 양쪽 모두 기본 알고리즘을 사용하거나, 동일한 알고리즘으로 통일해야 합니다.
Java123456789101112<span class="line"><span>// JasyptConfig.java</span></span><span class="line"><span>@</span><span>Bean</span><span>(</span><span>"jasyptStringEncryptor"</span><span>)</span></span><span class="line"><span>public</span><span> StringEncryptor </span><span>stringEncryptor</span><span>() {</span></span><span class="line"><span> // ...</span></span><span class="line"><span> SimpleStringPBEConfig config </span><span>=</span><span> new</span><span> SimpleStringPBEConfig</span><span>();</span></span><span class="line"><span> config.</span><span>setPassword</span><span>(encryptKey);</span></span><span class="line"><span> // ▼ 이 알고리즘이 암호화 시 사용한 알고리즘과 같은지 확인!</span></span><span class="line"><span> config.</span><span>setAlgorithm</span><span>(</span><span>"PBEWithMD5AndDES"</span><span>); </span></span><span class="line"><span> // ...</span></span><span class="line"><span> encryptor.</span><span>setConfig</span><span>(config);</span></span><span class="line"><span> return</span><span> encryptor;</span></span><span class="line"><span>}</span></span> @Value어노테이션 확인:- 설정 클래스에서
@Value("${jasypt.encryptor.password}")를 통해 비밀 키를 주입받고 있다면, 이 프로퍼티가application.properties나 환경 변수를 통해 제대로 주입되고 있는지 확인해야 합니다.
- 설정 클래스에서
문제 해결 체크리스트 (순서대로 확인)
- 비밀 키가 100% 동일한가?
- 암호화할 때 쓴 키와, 앱 실행 시 환경 변수/JVM 옵션으로 넘겨준 키가 완벽히 같은지 다시 확인한다. (가장 유력한 원인)
- Jasypt가 키를 잘 읽고 있는가?
application.properties에jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD}설정을 추가하여 경로를 명시해본다.
- 환경 변수 이름이 올바른가?
- Linux/macOS/Windows 환경 변수 이름은
JASYPT_ENCRYPTOR_PASSWORD인가? - JVM 옵션 이름은
-Djasypt.encryptor.password인가?
- Linux/macOS/Windows 환경 변수 이름은
- (설정 클래스가 있다면) 알고리즘이 동일한가?
JasyptConfig에 설정된 알고리즘과, 값을 암호화할 때 사용한 알고리즘이PBEWithMD5AndDES(또는 다른 지정된 알고리즘)로 동일한지 확인한다.
- Jasypt 라이브러리 버전 호환성:
- 드물지만 Spring Boot 버전과 Jasypt 라이브러리(
jasypt-spring-boot-starter) 버전 간의 호환성 문제가 있을 수 있습니다. 의심될 경우, Jasypt 버전을 한 단계 낮추거나 높여서 테스트해본다.
- 드물지만 Spring Boot 버전과 Jasypt 라이브러리(
대부분의 EncryptionOperationNotPossibleException 오류는 1번, 즉 비밀 키 불일치에서 비롯됩니다. 이 부분을 가장 먼저, 그리고 가장 꼼꼼하게 확인하시면 문제를 해결하실 수 있을 겁니다.