Jasypt 라이브러리 + EncryptionOperationNotPossibleException

이 오류는 이름 그대로 **”암호화/복호화 작업을 수행할 수 없다”**는 의미이며, 원인은 거의 대부분 암/복호화 키(Secret Key)가 일치하지 않거나, Jasypt 설정이 제대로 적용되지 않았기 때문입니다.


원인 1: 비밀 키(Secret Key) 불일치 (가장 흔한 원인)

가장 가능성이 높은 원인입니다. 값을 암호화할 때 사용한 키 애플리케이션이 복호화하려고 할 때 사용하는 키가 서로 다른 경우입니다. 공백 하나, 대소문자 하나만 달라도 이 예외가 발생합니다.

✅ 해결 방법:

  1. 키 재확인:
    • application.properties에 암호화된 값을 생성할 때 사용했던 비밀 키를 다시 한번 정확히 확인합니다.
    • 애플리케이션을 실행할 때 주입하는 환경 변수 또는 JVM 옵션의 키 값과 글자 하나하나 완벽하게 일치하는지 비교합니다. (복사/붙여넣기를 추천합니다.)
  2. 새로운 값으로 암호화 및 적용:
    • 가장 확실한 방법은, 현재 실행 환경에 설정된 비밀 키를 사용하여 값을 다시 암호화하는 것입니다.
    • 2단계: JVM 옵션으로 -Djasypt.encryptor.password="my-real-secret-key"를 설정하고 앱을 실행합니다.
    • 3단계: 온라인 암호화 도구나 Java 코드를 사용하여, my-real-secret-key를 비밀번호로 넣고 평문을 암호화합니다.
    • 4단계: 새로 생성된 암호화된 값을 복사하여 application.properties ENC(...) 안에 붙여넣고 다시 실행합니다.

원인 2: Jasypt가 비밀 키를 찾지 못하는 경우

애플리케이션이 시작될 때 Jasypt가 비밀 키를 어디서 읽어와야 할지 몰라서 복호화를 시도조차 못 하는 경우입니다.

✅ 해결 방법:

  1. application.properties에 비밀 키 경로 명시:
    • 가장 명확한 방법은 application.properties 파일에 Jasypt가 비밀 키를 어디서 가져와야 하는지 알려주는 것입니다. 이렇게 하면 설정이 코드에 명시적으로 드러나 관리가 편합니다.
    properties

  2. 환경 변수 또는 JVM 옵션 이름 확인:
    • Jasypt는 기본적으로 jasypt.encryptor.password 라는 이름의 프로퍼티를 찾습니다.
    • 환경 변수로 설정할 때는 대문자와 언더스코어를 사용하여 JASYPT_ENCRYPTOR_PASSWORD로 설정해야 Spring Boot가 이를 jasypt.encryptor.password로 올바르게 변환하여 인식합니다.
    • JVM 옵션으로 설정할 때는 -Djasypt.encryptor.password="your-key" 처럼 소문자와 점을 사용해야 합니다.

원인 3: Jasypt 설정 클래스(JasyptConfig)의 오류

JasyptConfig.java와 같은 설정 클래스를 직접 만들어서 사용하는 경우, 이 클래스의 설정이 암호화 시 사용된 설정과 다를 때 예외가 발생할 수 있습니다.

✅ 해결 방법:

  1. 알고리즘 일치 확인:
    • JasyptConfig 클래스에서 config.setAlgorithm(...)으로 설정한 알고리즘이 암호화할 때 사용한 알고리즘과 동일한지 확인해야 합니다.
    • Jasypt의 기본 알고리즘은 PBEWithMD5AndDES 입니다. 만약 암호화 시 기본값으로 해놓고, 설정 클래스에서는 다른 알고리즘(예: PBEWithHMACSHA512AndAES_256)을 사용했다면 당연히 복호화에 실패합니다.
    • 특별한 이유가 없다면 양쪽 모두 기본 알고리즘을 사용하거나, 동일한 알고리즘으로 통일해야 합니다.
    Java

  2. @Value 어노테이션 확인:
    • 설정 클래스에서 @Value("${jasypt.encryptor.password}")를 통해 비밀 키를 주입받고 있다면, 이 프로퍼티가 application.properties나 환경 변수를 통해 제대로 주입되고 있는지 확인해야 합니다.

문제 해결 체크리스트 (순서대로 확인)

  1. 비밀 키가 100% 동일한가?
    • 암호화할 때 쓴 키와, 앱 실행 시 환경 변수/JVM 옵션으로 넘겨준 키가 완벽히 같은지 다시 확인한다. (가장 유력한 원인)
  2. Jasypt가 키를 잘 읽고 있는가?
    • application.properties jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD} 설정을 추가하여 경로를 명시해본다.
  3. 환경 변수 이름이 올바른가?
    • Linux/macOS/Windows 환경 변수 이름은 JASYPT_ENCRYPTOR_PASSWORD 인가?
    • JVM 옵션 이름은 -Djasypt.encryptor.password 인가?
  4. (설정 클래스가 있다면) 알고리즘이 동일한가?
    • JasyptConfig에 설정된 알고리즘과, 값을 암호화할 때 사용한 알고리즘이 PBEWithMD5AndDES (또는 다른 지정된 알고리즘)로 동일한지 확인한다.
  5. Jasypt 라이브러리 버전 호환성:
    • 드물지만 Spring Boot 버전과 Jasypt 라이브러리(jasypt-spring-boot-starter) 버전 간의 호환성 문제가 있을 수 있습니다. 의심될 경우, Jasypt 버전을 한 단계 낮추거나 높여서 테스트해본다.

대부분의 EncryptionOperationNotPossibleException 오류는 1번, 즉 비밀 키 불일치에서 비롯됩니다. 이 부분을 가장 먼저, 그리고 가장 꼼꼼하게 확인하시면 문제를 해결하실 수 있을 겁니다.