기본 로그인 계정 추가
@Bean
UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User
.withUsername("user")
.password(passwordEncoder.encode("user123"))
.roles("USER")
.build());
manager.createUser(User
.withUsername("admin")
.password(passwordEncoder.encode("admin123"))
.roles("ADMIN")
.build());
return manager;
}
비밀번호 암호화
- Spring Security 5 부터
DelegatingPasswordEncoder
클래스가 기본 PasswordEncoder
.
DelegatingPasswordEncoder
클래스 안에 비밀번호 해시 알고리즘 별로 Map에 저장
bcrypt
, noop
, sha256
, etc
- 해시 알고리즘 별
PasswordEncoder
선택 위해 패스워드 앞에 prefix 추가
- {bcrypt}....
- {noop}password
- {pbkdf2}...
- {sha256}...
- prefix 생략되는 경우 기본값 bcrypt 인코더 선택
DelegatingPasswordEncoder
말고 세부 PasswordEncoder
를 Bean
으로 등록해도 됨.
BcryptPasswordEncoder
를 Bean
으로 등록
- password 업그레이드
- 비밀번호 해시 알고리즘 변경 시 강력한 해시 알고리즘으로 업그레이드
InMemoryUserDetailsManager
객체 사용 시 로그인 최초 1회 성공 시 {noop} 에서 {bcrypt}로 encoder 업그레이드
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
로그아웃 기능 설정
LogoutFilter
SecurityFilterChain
에 필터 추가
HttpSecurity http;
http.logout(logout -> logout
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
.clearAuthentication(true)
.deleteCookies("remember-me"))
쿠키 기반 자동 로그인
RememberMeAuthenticationFilter
SecurityFilterChain
에 필터 추가
HttpSecurity http;
http.rememberMe(remember -> remember
.rememberMeCookieName("remember-me")
.rememberMeParameter("remember-me")
.tokenValiditySeconds(300)
.alwaysRemember(false))