이번에 토이 프로젝트를 진행하면서 비밀번호 암호화에 대한 새로운 방법을 고민 중이었다. 이전에 하던 프로젝트는 그냥 MD5를 사용했지만, 이번 프로젝트는 배포까지 해 볼 예정이라 좀 더 안전한 암호화 방법이 필요했다. 열심히 구글링을 해보다 bcrypt라는 라이브러리가 있다는 것을 알게 되었다!
Bcrypt는 내부에서 랜덤으로 salt를 생성하여 이를 평문에 붙이고 해싱을 해주는 기능으로, spring-security에서 제공 중이다.
연산속도가 느리기 때문에 SHA와 다르게 보안에 취약하지 않다는 장점이 있다.
먼저, 위의 주소로 들어가서 spring-security를 검색해 pom.xml에 core, web, config를 추가해준다.
중요한 것은 이 때 Spring의 버전과 맞아야 오류가 나지 않는다는 것이다.
라이브러리의 버전을 확인하는 방법은 하나를 클릭해서 들어간 후 각 버전을 누른 뒤 밑에 compile dependencies에 나와있는 Spring 버전을 확인하는 것이다.
나는 Spring 버전이 4.3.9 이고 그에 맞는 Spring Security의 버전은 4.2.3 이었다.
이것을 복사해서 pom.xml에 아래처럼 붙여 넣어줬다.
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
먼저, WEB-INF/spring 에 spring-security.xml을 추가해준다
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>
그리고 위의 코드를 복사해서 spring-security.xml에 붙여 넣는다.
다음으로, web.xml의 root-context.xml이 써져 있는 자리 바로 밑에 아래처럼 spring-security.xml을 추가해준다.
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<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>
마지막으로, 사용하고자 하는 Controller에 @Autowired를 이용해 bcrypt를 추가해준다. 이제 bcrypt를 사용할 수 있다.
passEncoder.encode(암호화할 비밀번호) 를 사용하면 암호화 된 값이 나오고,
비교할 때는 if문을 사용하여 passEncoder.matches(입력받은 비밀번호, 암호화된 비밀번호) 로 비교해주면 된다!