본문 바로가기
Java/Spring

Spring) 암호화 처리 - BCryptPasswordEncoder

by 박채니 2022. 8. 22.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


암호화 처리

 

spring-security 의존 설정하기

 

pom.xml

#7. spring-security 관련 의존

<properties>
    <java-version>1.8</java-version>
    <org.springframework-version>5.2.22.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.10</org.aspectj-version>
    <org.slf4j-version>1.6.6</org.slf4j-version>
    <!-- 추가! -->
    <org.springframework.security-version>5.3.3.RELEASE</org.springframework.security-version>
</properties>

<!-- #7. spring-security 관련 의존 -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${org.springframework.security-version}</version>        
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${org.springframework.security-version}</version>        
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${org.springframework.security-version}</version>        
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${org.springframework.security-version}</version>        
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>${org.springframework.security-version}</version>        
</dependency>

 

암호화 처리 빈 등록

bcrypt

- 랜덤 솔트 값 (bcrypt 내부에서) 을 추가해줌

 

security-context.xml 설정 파일 추가

web.xml

security 관련은 root-context (전역)에서 관리!

- 각 context 별로 설정 파일은 여러개 일 수 있음

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

 

security-context.xml

<?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.3.xsd">
	
	<!-- #7.1 암호화 처리 빈 등록 -->
	<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>

</beans>

namespace - security 추가!

 

servlet-context에서 root-context를 참조할 수 있으므로 MemberController에서 등록한 bcryptpasswordEncoder 빈을 사용할 수 있습니다.

 

MemberController

@Autowired
private BCryptPasswordEncoder bcryptPasswordEncoder;
	
@PostMapping("/memberEnroll.do")
public String memberEnroll(Member member, RedirectAttributes redirectAttr) {
    try {
        // 비밀번호 암호화
        String rawPassword = member.getPassword();
        String encodePassword = bcryptPasswordEncoder.encode(rawPassword);
        member.setPassword(encodePassword);
        log.debug("encodePassword = {}", encodePassword);

        int result = memberService.insertMember(member);
        redirectAttr.addFlashAttribute("msg", "회원가입이 정상적으로 처리 되었습니다.");

        return "redirect:/";
    } catch(Exception e) {
        log.error("회원 가입 오류 : " + e.getMessage(), e);
        throw e;
    }
}

@콘솔출력값
DEBUG: com.ce.spring2.member.controller.MemberController - encodePassword = $2a$10$G7F3EfcXE8wJWUAsCznaoOqttim4MwJBNlWey5yuL5ZRMwRSdPvEi

성공적으로 암호화 처리가 된 것을 확인할 수 있으며, 랜덤솔트 값이 적용되기 때문에 동일한 비밀번호를 입력해도 상이한 결과가 나옵니다.

 

$2a$10$G7F3EfcXE8wJWUAsCznaoOqttim4MwJBNlWey5yuL5ZRMwRSdPvEi
- $2a$ : 알고리즘 타입
- 10$ : 옵션 (비용이 높을수록 속도가 오래걸리고, 메모리 사용량이 많음)
- G7F3EfcXE8wJWUAsCznaoO(22자리) : random salt
- qttim4MwJBNlWey5yuL5ZRMwRSdPvEi(31자리) : hashing + encoding 처리