SecurityConfig

@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();
    }
}

로그아웃 기능을 추가하기로 마음먹고, 어떻게 사용자의 로그인 상태를 해제할 수 있을까 고민해보았다.

  1. 사용자의 HTTP 세션을 무효화한다 (httpSession.invalidate())
  2. SecurityContext에 저장된 인증 객체를 제거한다.
  3. DB는 건드지리 않는다. (사용자 정보 자체는 삭제하는 것이 아니므로)

하지만 직접 로그아웃을 구현하지 않아도 spring security에서 더 완벽하게 구현해 놓았다.

지금부터 spring security의 로그아웃 과정을 분석해 보겠다. (틀린 정보나 부족한 정보 있으면 피드백 해주시면 감사하겠습니다.)

1. 설정 단계: 애플리케이션 시작 시 (설계도를 그리는 과정)

image.png

1단계: http.logout() 호출과 LogoutConfiguer 생성

2단계: 기본 핸들러( SecurityContextLogoutHandler) 준비