Sekkison 유저의 비밀번호를 안전하게 저장하기위해
BCryptPasswordEncoder
를 사용해서 암호화를 진행하기로 하였다.
BCryptPasswordEncoder
Spring Seurity에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 가진 클래스
- 먼저
spring-boot-starter-security
를build.gradle
에 추가한다.build.gradle
dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' }
SecurityConfig
클래스에BCryptPasswordEncoder
을bean
으로 등록한다.
(SecurityConfig.Class
는config
폴더 아래에 만들었다. )@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter{ @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
이제
passwordEncoder
를 사용할 수 있다.String str = "1234" String encodeStr = bCryptPasswordEncoder.encode(str); System.out.println(encodeStr);
을 실행시켜 보면 인코딩된 문자열을 볼 수 있을 것이다.
우리 프로젝트에서는
UserService
의 회원가입 로직에 추가해 사용하였다.user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); userRepository.save(user); Authority authmember = authorityRepository.findByAuth("MEMBER"); UserAuthority ua = UserAuthority.builder() .userId(user.getId()) .authority(authmember.getId()) .build(); userAuthorityRepository.save(ua);
저장된 데이터를 확인해 보면 다음과 같이 인코딩된 비밀번호를 확인할 수 있다.
만약, API 서버로 스프링 프로젝트를 제작한다면, 서버에 데이터를 요청했을 때 만들지도 않은 로그인 페이지가 뜨는 경우가 있다.
이 경우
Security Config
클래스에configure
함수를 추가하면 해결이 될 것이다.@Override protected void configure(HttpSecurity http) throws Exception { // CSRF 비활성화 http.csrf().disable(); // 인증 설정 http .authorizeRequests() // "/test/**" 로 들어오는 요청은 '인증'만 필요. .antMatchers("/test/**").authenticated() // /admin/** 주소로 들어오는 요청은 '인증' + ADMIN 권한 필요 .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") // 그 외에는 모두 접근 가능 .anyRequest().permitAll() }
이제
test/..
,/admin/..
주소의 요청만 로그인 페이지로 이동하고,
/admin/..
페이지에서는admin
권한도 같이 필요할 것이다.그리고 그 외의 주소의 요청은 모두 로그인이 필요없기 때문에 기본 로그인 페이지로 이동하지 않는다.
참고로,
SecurityConfig.class
의 전문이다.// 스프링 시큐리티 설정 @Configuration // 스프링컨테이너에 빈으로 생성 @EnableWebSecurity // WebSecurity 를 활성화 public class SecurityConfig extends WebSecurityConfigurerAdapter{ // BCryptPasswordEncoder 를 bean 으로 등록 @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { // CSRF 비활성화 http.csrf().disable(); // 인증 설정 http .authorizeRequests() // "/test/**" 로 들어오는 요청은 '인증'만 필요. .antMatchers("/test/**").authenticated() // /admin/** 주소로 들어오는 요청은 '인증' + ADMIN 권한 필요 .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") // 그 외에는 모두 접근 가능 .anyRequest().permitAll() } }