우리가 프로젝트를 진행하다보면 회원가입기능을 구현할 때가 종종있다. 회원가입을 구현할 때 회원의 정보를 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 |