language/Spring

[Spring/Spring Security] spring framework에 BCryptPasswordEncoder 적용시키기

zincah 2022. 4. 24. 02:50
반응형

1. BCryptPasswordEncoder

스프링 시큐리티(Spring Security) 프레임워크에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 가진 클래스

스프링 시큐리티 5.4.2 이상 부터 위의 세가지 메소드를 다 사용할 수 있습니다.

 

encode() : 암호화되지 않은 것들을 암호화 시키는 메소드 입니다.
matches() : storage에서 가져온 인코딩된 암호가 인코딩된 후 제출한 원시암호와 일치하는 지 확인하는 메소드 입니다. boolean 형으로 반환하는데 일치하면 true로 반환하고 일치하지 않으면 false를 반환합니다. 그렇다고 암호 자체가 디코딩되는 것이 아닙니다.
upgradeEncoding() : 보안을 위해 인코딩 된 암호를 다시 인코딩 해야하는 경우 true를 반환하고 아니면 false를 반환합니다. default 형은 false 입니다.

 

2. PasswordEncoder Test

pom.xml, web.xml, security-context.xml, BCryptoPasswordEncoder Bean

 

1) pom.xml

<!-- security -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>5.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.6.0</version>
</dependency>

 

2) web.xml

<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/presentation-layer.xml</param-value>
        <param-value>/WEB-INF/config/security-config.xml</param-value>
    </init-param>
</servlet>

security 설정을 해줄 security-config.xml 파일을 web.xml에 등록해줍니다.

 

3) security-config.xml

WEB-INF폴더 안에 config라는 폴더를 생성해서 security-config이라는 이름으로 Spring Bean Configuration File을 생성합니다. file name을 입력하는 란이 나올 거고 거기에 이름을 설정해두고 next를 눌러줍니다.

사진에 체크되어 있는 3가지를 체크하고 Finish를 눌러줍니다. 그리고 BCryptPasswordEncoder를 빈으로 등록해줍니다.

 

<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>

이런식으로 사용을 해주면 됩니다. 저는 패스워드 인코딩을 테스트 해보기 위해서 test class를 생성해보겠습니다.

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/config/security-config.xml"})
public class PasswordEncoder {
	
	@Autowired
    BCryptPasswordEncoder passwordEncoder;
	
	@Test
	public void checkEncoding() {
		
		String rawPass = "dkssud";
		String encodePassword1;
		String encodePassword2;
		
		encodePassword1 = passwordEncoder.encode(rawPass);
		encodePassword2 = passwordEncoder.encode(rawPass);
		
		System.out.println(encodePassword1);
		System.out.println(encodePassword2);
		
		String truePass = "dkssud";
		String wrongPass = "wkfrk";
		
		System.out.println("true password verify : " + passwordEncoder.matches(truePass, encodePassword2));
		System.out.println("wrong password verify : " + passwordEncoder.matches(wrongPass, encodePassword2));
		
	}

}

src/test/java 소스 폴더 내부에 패키지 안에 test class를 위처럼 작성해줍니다. 그 다음에 실행시켜 주고 아래와 같이 console 화면이 나오면 패스워드가 잘 인코딩 되는 것을 확인할 수 있습니다.

 

반응형