3.10에서 4.1으로 마이그레이션 시 질문사항
- 작성자 :
- 유*덕
- 작성일 :
- 2024-05-08 11:43:16
- 조회수 :
- 464
- 구분 :
- 호환성확인
- 진행상태 :
- 완료
Q
보안상 파일은 제공드릴수 없는점 양해부탁드립니다.
3.10 -> 4.1 로 마이그 하던 작업 도중 발생한 오류입니다.
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:289)
at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:237)
PasswordEncoder의 ID가 맵핑 되지 않는다는 오류입니다.
기존에 3.10에서 사용하던 PasswordEncoder 입니다.
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" />
이것을 4.1에 맞게
변경하였습니다.
->
<bean id="passwordEncoder" class="org.springframework.security.crypto.password.DelegatingPasswordEncoder">
<constructor-arg name="idForEncode" value="sha256"/> <!-- 암호화 방식 지정 -->
<constructor-arg>
<map>
<!-- SHA-256 암호화 방식 설정 -->
<entry key="sha256">
<!-- 원하는 암호화 클래스 지정 -->
<bean class="org.springframework.security.crypto.password.MessageDigestPasswordEncoder">
<constructor-arg value="SHA-256"/> <!-- 암호화 알고리즘 지정 -->
</bean>
</entry>
</map>
</constructor-arg>
</bean>
위와 같은 java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
에러 발생합니다. passwordEncoder를 사용하지 않는 것 같아서 지워도 발생합니다.
egov쪽 에서 참조 사용하는 것 같습니다. 해결법좀 부탁드립니다.
좀더 찾아본 결과 스프링 5.x 부터는 비밀번호 입력시 암호화 하여야 하는것이 필수라서 위와같은 에러가 ( 해당 비밀번호를 암호화할게 null 이 들어옴) 발생한다고 하네요.
저희 프로젝트는 솔루션을 이용한 프로시져 암호화를 사용하고 있는데, 위와 같은 에러 우회할 수 있는 방법좀 알려주세요
3.10 -> 4.1 로 마이그 하던 작업 도중 발생한 오류입니다.
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:289)
at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:237)
PasswordEncoder의 ID가 맵핑 되지 않는다는 오류입니다.
기존에 3.10에서 사용하던 PasswordEncoder 입니다.
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" />
이것을 4.1에 맞게
변경하였습니다.
->
<bean id="passwordEncoder" class="org.springframework.security.crypto.password.DelegatingPasswordEncoder">
<constructor-arg name="idForEncode" value="sha256"/> <!-- 암호화 방식 지정 -->
<constructor-arg>
<map>
<!-- SHA-256 암호화 방식 설정 -->
<entry key="sha256">
<!-- 원하는 암호화 클래스 지정 -->
<bean class="org.springframework.security.crypto.password.MessageDigestPasswordEncoder">
<constructor-arg value="SHA-256"/> <!-- 암호화 알고리즘 지정 -->
</bean>
</entry>
</map>
</constructor-arg>
</bean>
위와 같은 java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
에러 발생합니다. passwordEncoder를 사용하지 않는 것 같아서 지워도 발생합니다.
egov쪽 에서 참조 사용하는 것 같습니다. 해결법좀 부탁드립니다.
좀더 찾아본 결과 스프링 5.x 부터는 비밀번호 입력시 암호화 하여야 하는것이 필수라서 위와같은 에러가 ( 해당 비밀번호를 암호화할게 null 이 들어옴) 발생한다고 하네요.
저희 프로젝트는 솔루션을 이용한 프로시져 암호화를 사용하고 있는데, 위와 같은 에러 우회할 수 있는 방법좀 알려주세요
환경정보
-
- OS 정보 : linux
- 표준프레임워크 버전 : 4.1
- JDK(JRE) 정보 : 1.8
- WAS 정보 : tomcat 9.0
- DB 정보 : mysql
- 기타 환경 정보 : 3.10 -> 4.1 로 마이그레이션 작업
A
안녕하세요.
표준프레임워크 센터입니다.
작성해주신 내용만으로는 정확한 원인을 알 수 없으나
DelegatingPasswordEncoder에
암호화 할 비밀번호의 ID가 명시적으로 매핑되지 않은 경우에 사용되도록
비밀번호를 인코딩하지 않고 그대로 저장하는 인코더인
NoOpPasswordEncoder를 함께 구성하는 방법이 있습니다.
추가적으로
표준프레임워크의 암호화/복호화에서는 PasswordEncoder로
egovframework.rte.fdl.cryptography.EgovPasswordEncoder를 사용한다는 점
참고 부탁 드리며
이 밖에 마이그레이션과 관련된 가이드는
아래 URL의 실행환경 업그레이드 가이드 부분을
고해 주시기 바랍니다.
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:%EC%8B%A4%ED%96%89%ED%99%98%EA%B2%BD%EA%B0%80%EC%9D%B4%EB%93%9C
감사합니다.
표준프레임워크 센터입니다.
작성해주신 내용만으로는 정확한 원인을 알 수 없으나
DelegatingPasswordEncoder에
암호화 할 비밀번호의 ID가 명시적으로 매핑되지 않은 경우에 사용되도록
비밀번호를 인코딩하지 않고 그대로 저장하는 인코더인
NoOpPasswordEncoder를 함께 구성하는 방법이 있습니다.
... <map> <entry key="sha256"> <bean class="org.springframework.security.crypto.password.MessageDigestPasswordEncoder"> <constructor-arg value="SHA-256"/> </bean> </entry> <entry key="{noop}"> <bean class="org.springframework.security.crypto.password.NoOpPasswordEncoder"/> </entry> </map> ... |
추가적으로
표준프레임워크의 암호화/복호화에서는 PasswordEncoder로
egovframework.rte.fdl.cryptography.EgovPasswordEncoder를 사용한다는 점
참고 부탁 드리며
이 밖에 마이그레이션과 관련된 가이드는
아래 URL의 실행환경 업그레이드 가이드 부분을
고해 주시기 바랍니다.
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:%EC%8B%A4%ED%96%89%ED%99%98%EA%B2%BD%EA%B0%80%EC%9D%B4%EB%93%9C
감사합니다.