스프링 시큐리티 설정

회원 가입시 사용자가 설정한 비밀번호가 DB에 그대로 저장이 되면 보안에 매우 취약하기 때문에 해쉬 암호화를 한번 진행하고 저장해야한다. 이때 많이 쓰는 방법이 BCryptPasswordEncoder에 encode() 메소드를 사용하는 것이다. 스프링 시큐리티에서 제공하기 때문에 의존성을 추가해야한다.
bulid.gradled에 추가

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security'

SecurityConfig

@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();
    }
}
  • EnableWebSecurity: 스프링 시큐리티 적용을 위한 어노테이션
  • configure(): 스프링 시큐리티에서 제공하는 로그인 페이지 제거
  • PasswordEncoder: 스프링 시큐리티의 인터페이스이며 BCrypt 해싱 알고리즘을 이용한 구현체를 스프링 빈으로 등록한다.

테스트 케이스

@SpringBootTest
public class PasswordEncodedTest {

    @Autowired
    UserService userService;

    @Autowired
    UserRepository userRepository;

    BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

    @Test
    public void 비밀번호_일치_테스트() {
        Member member = new Member("hello", userService.encryptPassword("1234"), "email","pic");

        Assertions.assertThat(bCryptPasswordEncoder.matches("1234",member.getPassword())).isEqualTo(true);
    }

    @Test
    public void 같은_비밀번호_다른_해시값_테스트() {
        Member memberA = new Member("memberA", userService.encryptPassword("1234"), "email","pic");
        Member memberB = new Member("memberB", userService.encryptPassword("1234"), "email", "pic");

        assertThat(memberA.getPassword()).isNotEqualTo(memberB.getPassword()); // 값이 다르면 성공

    }
}
  • matches로 rawPassword와 encodedPassword가 같은지 비교할 수 있다.
  • 같은 rawPassword라도 해시 값이 다르게 나온다.

카테고리:

업데이트:


Comments