[Spring] Spring Security 비밀번호 암복호화

yed·2021년 11월 22일
0

스프링 시큐리티의 경우 의존성문제로 사용중인 스프링 버전과 잘맞춰야 문제없이 호환이 된다고 한다
내가 사용중인 스프링의 버전은 4.3.8.RELEASE인데 maven에서 각 버전마다 맞는 스프링버전을 Compile Dependencies에서 확인할 수 있음

그런데 4.3.8버전에 딱맞는 시큐리티버전이 없음.... 그래서 그냥 하위버전인 4.3.5가 적용되는 시큐리티 4.2.2.RELEASE을 사용할 예정
😂

pom.xml 설정

  • <properties>에 시큐리티 버전 추가하기
<security-version>4.2.2.RELEASE</security-version>
  • <dependency> 추가하기
<!-- Security -->
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-core</artifactId>
	<version>${security-version}</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-web</artifactId>
	<version>${security-version}</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-config</artifactId>
	<version>${security-version}</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-taglibs</artifactId>
	<version>${security-version}</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-test</artifactId>
	<version>${security-version}</version>
</dependency>

spring-security.xml 추가

webapp>WEB-INF>spring 에 파일 추가하기

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd">
	
	<beans:bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> 

</beans:beans>

web.xml 설정

<servlet><param-value>로 spring-security 경로 추가하기

<param-value>
	/WEB-INF/spring/appServlet/servlet-context.xml
	/WEB-INF/spring/spring-security.xml
</param-value>

여기까지가 security 설정끝 사용해보기

@Inject
BCryptPasswordEncoder passEncoder;

암복호화를 도와줄 bean

  • 회원가입 할때 입력받은 비밀번호를 암호화해서 db에 저장한다. db 컬럼길이는 여유있게 100까지 설정해줌
  • 로그인할 때 입력받은 아이디로 DB 회원정보를 조회하고 저장된 비밀번호를 복호화한 값과 입력받은 비밀번호가 일치하면 로그인 성공

비밀번호 암호화

vo.setMemberPassword(passEncoder.encode(vo.getMemberPassword()));

비밀번호 복호화

if(passEncoder.matches(memberPassword, vo.getMemberPassword())){
...//복호화한 값과 입력받은 값이 일치할 때
}

간단하쥬


그런데.. @Inject 문제가 발생.
No qualifying bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'
뭐지 이 데자뷰는 이전에 이미 서버의 시점문제로 잘 설정해둔 bean을 찾을 수 없다는 전적이 있는 프로그램이다.
그래서 내생각엔 spring-security.xml을 서버가 제대로 읽지 못해서 bean이 없다고 뜨는것같다.
일단 임시방편으로 아예 controller단에서 bean을 가져와줬더니 멀쩡히 돌아간다.. 역시 시점문제구만
설정에서 해결하는 깔끔한 방법도 찾아봐야겠다.

@Bean
BCryptPasswordEncoder passwordEncoder() {
	return new BCryptPasswordEncoder();
}

11.23 해결방법

먼저 web.xml 설정이 잘못되었음..
servlet-context.xml이 있는 곳이 아니라 root-context.xml이 있는 param에 설정해야함! 그리고! ,로 연결해야함!!!!!!!

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/spring/root-context.xml,
		/WEB-INF/spring/spring-security.xml
	</param-value>
</context-param>

그런데 이렇게 설정해도 nosuchbean어쩌구는 여전히 에러발생함

그래서 @Inject이 bean을 찾지못했던 문제를 @Bean으로 해결해뒀는데 대신에

@Resource(name = "bcryptPasswordEncoder")
BCryptPasswordEncoder passEncoder;

@Resource를 사용해 bean을 명시해주었다.. 보다 깔끔해졌군

@Inject를 사용하는 방식은 다른컴퓨터로 똑같은 코드로 사용했을때 정상작동했던것을 보아하니 지금 문제가 발생하는 컴퓨터의 문제같아서 여기까지만하고 마무리해야겠다


참고자료

profile
6개월 국비과정 기록하기

0개의 댓글