본문 바로가기

웹 개발/Spring Boot

Spring Boot) BCryptPasswordEncoder 사용해서 사용자 비밀번호 암호화하기

 

1. 의존성 추가

build.gradle 파일에 의존성을 추가해준다. 

spring-boot-starter-security

dependencies {
	...
	implementation 'org.springframework.boot:spring-boot-starter-security'
    ...
 }

 

2. SpringSecurity.java

이걸 추가하면 웹 처음 화면에 기본적으로 제공해주는 로그인 창이 뜨는데 이건 사용하지 않을 것이므로 컨피그를 아래와 같이 추가해준다. 

package com.kpmg.lighthouse.tpplatform.tpplatform;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SpringSecurity extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http
        .cors().disable()		//cors방지
        .csrf().disable()		//csrf방지
        .formLogin().disable()	//기본 로그인 페이지 없애기
        .headers().frameOptions().disable();	
    }

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

}

 

3. 사용자 엔티티 저장하는 서비스단에서 encoder 사용하기

아래 예시와 같이 사용하면 된다.  

이때 User 테이블과 JPA레포지토리를 상속한 userRepository가 있다는 것을 가정한다. 

@Service("userInfoService")
public class UserInfoService {

    @Autowired
    UserRepository userRepository;
    @Autowired
    PasswordEncoder passwordEncoder;
    
    @Transactional
    public void encryptPassword(String userPw){
        User user = new User();
        String enPw = passwordEncoder.encode(userPw);
        user.setPw(enPw);
        userRepository.save(user);
    }
   }

 

이렇게 하고 h2 console로 데이터를 확인해보면 raw password는 볼 수없고 암호화된 패스워드만 보인다. 

 

4. 암호화된 패스워드 일치 여부 확인하기 

내가 구글링해본 결과 BCrypPasswordEncoder는 따로 decode 함수를 제공하는 것 같지 않다. 그냥 raw 데이터와 암호화된 데이터가 일치하는지에 대한 여부를 반환하는 matches 함수를 사용해야 한다. 

로그인 처리를 위해 사용자가 입력한 패스워드와 사용자 디비에 저장된 암호화된 패스워드가 일치하는지 확인하기 위한 함수를 아래와 같이 사용한다. 

@Autowired
PasswordEncoder passwordEncoder;

public Boolean login(String id, String rawPw){
	// 이 함수는 user repository에 따로 구현이 되어 있어야 한다. 
	User user = userRepository.findById(id);
    if(passwordEncoder.matches(rawPw, user.getUserPw())){
    	return true;
    } else{
    	return false;
    }
}