@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig{
private final CustomOAuth2UserService customOAuth2UserService;
private final OAuth2LoginSuccessHandler oAuth2LoginSuccessHandler;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception{
httpSecurity
.csrf(csrf->csrf.disable())
.headers(headers->headers.frameOptions().disable())
.authorizeHttpRequests(auth->auth
.requestMatchers("/","/css/**","/images/**","/js/**","/h2-console/**","/NEW","/ARTIST","/REVIEW","/TALK","/CONCERT").permitAll()
.requestMatchers("/api/v1/**").hasRole(Role.USER.name()) //.name()은 "USER" 리턴 -> hasRole에는 "ROLE_"없이 넣지만 내부적으로 "ROLE_"이 붙어서 비교됨
.anyRequest().authenticated()
)
.logout(logout->logout
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
)
.oauth2Login(oauth2 -> oauth2
.userInfoEndpoint(userInfo->userInfo
.userService(customOAuth2UserService)) //1. 유저 정보 가져올 때 쓸 서비스 등록
.successHandler(oAuth2LoginSuccessHandler) //2. 로그인 성공 후 처리할 핸들러 등록
);
return httpSecurity.build();
}
}
로그아웃 기능을 추가하기로 마음먹고, 어떻게 사용자의 로그인 상태를 해제할 수 있을까 고민해보았다.
하지만 직접 로그아웃을 구현하지 않아도 spring security에서 더 완벽하게 구현해 놓았다.
지금부터 spring security의 로그아웃 과정을 분석해 보겠다. (틀린 정보나 부족한 정보 있으면 피드백 해주시면 감사하겠습니다.)
http.logout()
호출과 LogoutConfiguer
생성HttpSecurity
객체는 내부적으로 LogoutConfigurer
라는 설정 전문가를 생성하고, 우리가 람다식으로 넘겨준 추가 설정(logoutSuccessUrl
등)을 이 Configurer
에게 전달한다.LogoutConfigurer
의 역할: 로그아웃 기능에 대한 모든 설정 (감시할 URL, 성공 시 이동할 URL, 사용할 핸들러 등)을 저장하는 설계도와 같은 객체이다.SecurityContextLogoutHandler
) 준비LogoutConfigurer
가 생성될 때, 가장 중요한 일이 일어난다.