블로피시 기반의 암호화 방식이다. SHA-512 방식은 만약 같은 패스워드가 있다면 암호화 된 결과는 같게 된다. 즉 마음만 먹는다면 문자열을 조합해서 암호를 풀 가능성이 생긴다. Bcrypt는 내부에서 salt 과정을 거쳐서 암호화 때마다 결과값이 다르게 된다.
Bcrypt를 사용하기 위해서는 pom.xml에 spring security dependency를 추가해준다.
<!-- Spring-security 모듈 추가 -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.7.1</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.7.1</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.7.1</version>
</dependency>
src/main/resources 폴더 안에 Spring Bean Configuration file을 생성해준다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
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-5.7.xsd">
<!-- Bcrypt 암호화용 bean 생성 -->
<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
</beans>
내부에는 bcrypt사용을 위한 bean을 등록해준다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring/root-context.xml
classpath:spring/spring-security.xml
</param-value>
</context-param>
위와 같이 등록한 configuration bean file을 web.xml에 등록해준다. 위 과정을 거치지 않으면 사용이 불가능하다.
@Autowired
private BCryptPasswordEncoder bcrypt;
// 인스턴트를 생성해준다.
// 암호화를 위해서는 encode() 메소드를 사용해주면 된다.
/* parameter로 얻어온 회원의 비밀번호와 암호화된 DB상의
비교한다고 가정했을 때
두 값이 같은지를 비교하기 위해서는
matches(암호화 전의 비밀번호, 암호화 후의 비밀번호)
를 이용하면 된다.
*/
String dbPw = "sfekjlkgjzkgjgdrk@@fsslkle";
// 암호화된 패스워드라고 가정
@Override
public int checkPw(String toChangePw, String memberPw) {
if(bcrypt.matches(memberPw, dbPw){ // 만약 회원이 입력한
// memberPw와 db에 입력된 dbPw가 같다면
String changingPw = bcrypt.encode(toChangePw);
// 새롭게 바꿀 pw를 암호화해준다.
}
}