본문 바로가기

프로그래밍/Spring

[Spring] SpringSecurity 비밀번호 암호화

 우리가 프로젝트를 진행하다보면 회원가입기능을 구현할 때가 종종있다. 회원가입을 구현할 때 회원의 정보를 DB에 넣게 되는데, 비밀번호 같은 경우 그대로 DB에 넣게되면 보안에 매우 취약해지기 때문에 비밀번호를 암호화하여 암호화된 패스워드를 DB에 넣을 수 있도록 하여야한다.

 비밀번호를 암호화하는 방법에는 여러가지가 있는데, 스프링시큐리티에서 제공하는 BCrpyt를 이용한 비밀번호 암호화에 대해서 알아보고자 한다.

 

1. pom.xml에 Security 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

 BCrypt기능을 사용하기 위하여 pom.xml에 시큐리티를 추가한다.

 

다음과 같이 메이븐에 시큐리티를 추가하고 프로젝트를 실행하면 다음과 같은 화면이 뜰 것이다.

 위 화면은 스프링 시큐리티에서 기본으로 제공하는 로그인 창으로, config파일 설정을 통해 제어할 수 있다.

지금은 스프링시큐리티를 이용하여 비밀번호 암호화만 할 것이기 때문에 configuration을 추가하여 로그인화면이 뜨지 않도록 설정해주자.

2. Configuration 추가

package com.mia.test;

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 SecurityConfig extends WebSecurityConfigurerAdapter {
	
    // SpringSecurity 설정 관련 소스코드
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors().disable() // cors 방지
                .csrf().disable() // csrf 방지
                .formLogin().disable() // 기본 로그인 창이 뜨지 않도록 설정
                .headers().frameOptions().disable();
    }


	// BCrypt 관련 소스코드
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

}

 위와 같이 WebSecurityConfigurerAdapter를 상속 받은 SecurityConfig.java 파일을 생성 한다. 이후 다음과 같이 configure method를 상속받아 원하는 설정들을 작성 해준다.

 PasswordEncoder 메소드를 빈으로 설정해주어 암호화를 사용하고자하는 Service에서 @Autowired를 통해 PasswordEncoder를 선언할때 자동으로 클래스가 바인딩 되도록 한다.

 

3. Service에서 BCrypt 추가 및 비밀번호 해싱

@Service
@Transactional
public class UserService {


    UserRepository userRepository;

    PasswordEncoder passwordEncoder;

    @Autowired
    public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {

        this.userRepository =userRepository;
        this.passwordEncoder = passwordEncoder;
    }

    public User registerUser(String email, String name, String password) {
        Optional<User> existed = userRepository.findByEmail(email);
        if(existed.isPresent()){
            throw new EmailExistedException(email);
        }
        String encodePassword = passwordEncoder.encode(password); // 해싱하는 부분
        User user = User.builder()
                .email(email)
                .name(name)
                .password(encodePassword)
                .level(1L)
                .build();
        return userRepository.save(user);
    }
}

 위 소스코드를 확인해 보면 빈으로 설정했던 PasswordEncoder를 @Autowired로 바인딩하여 비밀번호를 암호화 하는 것을 볼 수 있다.

String encodePassword = passwordEncoder.encode(password);

바로 이 부분에서 비밀번호의 암호화가 이루어진다.

 

 

마지막으로 DB를 확인해 보면 비밀번호가 암호화 되어 들어간 것을 확인할 수 있다.

'프로그래밍 > Spring' 카테고리의 다른 글

[Spring] log4j  (0) 2022.03.28
[Spring] @Transactional  (0) 2022.03.28
[Spring] 싱글톤 패턴(Singleton pattern)  (0) 2022.03.11
[Spring] 의존성주입(Dependency Injection, DI)  (0) 2022.03.11
[Spring] ResponseEntity  (0) 2022.03.07