1. 개요

이 짧은 예제에서는 Spring Security에서 로그아웃 리디렉션을 비활성화하는 방법을 자세히 살펴볼 것 입니다.

먼저 Spring Security에서 로그아웃 흐름이 작동하는 방식에 대한 간단한 배경 지식으로 시작하겠습니다. 그런 다음 실제 예를 통해 성공적인 로그아웃 후 사용자 리디렉션을 방지하는 방법을 설명합니다.

2. 스프링 시큐리티에서 로그아웃

간단히 말해서, Spring Security는 logout() DSL 메소드 를 통해 로그아웃 메커니즘 에 대한 즉시 지원을 제공합니다 . 기본적으로 Spring Security는 사용자가 /logout 인 기본 로그아웃 URL에 도달할 때 로그아웃을 트리거합니다 .

Spring Security 4  이전  에는 로그아웃 URL의 기본값이 /j_spring_security_logout이었다는 점을 언급할 가치가 있습니다.

Spring Security는 로그아웃한 후 사용자를 특정 URL로 리디렉션할 수 있는 가능성을 제공합니다. 그러나 이 동작을 피하고 싶은 경우가 있습니다.

따라서 더 이상 고민하지 않고 Spring Security에서 로그아웃 리디렉션을 비활성화하는 논리를 구현하는 방법을 살펴보겠습니다 .

3. Spring Security 로그아웃 리디렉션 비활성화

기본적으로 Spring Security 는 성공적인 로그아웃 후 사용자를 /login?logout 으로 리디렉션합니다. 따라서 이 섹션에서는 사용자가 로그아웃한 후 로그인 페이지로 리디렉션되는 것을 방지하는 방법에 중점을 둘 것입니다.

logoutSuccessUrl() DSL 메서드 를 사용하여 기본 리디렉션 URL을 재정의할 수 있습니다 .

여기서 요점은 /logout URL이 REST 클라이언트에서 호출될 때 리디렉션을 피하는 방법을 보여주는 것입니다.

사실 Log outSuccessHandler 인터페이스는 로그아웃 프로세스가 성공적으로 수행되었을 때 사용자 정의 논리를 실행하는 유연한 방법을 제공합니다.

따라서 여기서는 사용자 정의 LogoutSuccessHandler 를 사용하여 깨끗한 200 상태 코드만 반환합니다 . 그렇게 하면 어떤 페이지로도 리디렉션되지 않습니다.

이제 로그아웃 리디렉션을 비활성화하는 데 필요한 Spring Security 구성을 구현해 보겠습니다.

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests(authz -> authz.mvcMatchers("/login")
            .permitAll()
            .anyRequest()
            .authenticated())
            .logout(logout -> logout.permitAll()
                .logoutSuccessHandler((request, response, authentication) -> {
                    response.setStatus(HttpServletResponse.SC_OK);
                }));
        return http.build();
    }

}

위의 구성에서 주목해야 할 중요한 부분은 logoutSuccessHandler() 메서드입니다. 보시다시피 람다 식을 사용하여 사용자 지정 로그아웃 성공 처리기를 정의합니다.

LogoutSuccessHandler 인터페이스 의 간단한 구현 클래스를 만들고 DSL을 사용하여 logoutSuccessHandler() 메서드에 전달할 수도 있습니다.

4. 테스트

이제 모든 조각을 모았으므로 /logout 끝점을 테스트하여 모든 것이 예상대로 작동하는지 확인하겠습니다.

테스트에서 /logout 요청  을 보내기 위해 MockMvc 를 사용할 것 입니다.

먼저 간단한 테스트 클래스를 만들고 여기에 MockMvc  개체를 삽입해 보겠습니다.

public class LogoutApplicationUnitTest {

    @Autowired
    private MockMvc mockMvc;

    // test case

}

이제 /logout 엔드포인트 를 테스트하는 메서드를 작성해 보겠습니다 .

@Test
public void whenLogout_thenDisableRedirect() throws Exception {

    this.mockMvc.perform(post("/logout").with(csrf()))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$").doesNotExist())
        .andExpect(unauthenticated())
        .andReturn();
}

마지막으로 테스트 코드를 분석해 보겠습니다.

  • perform(post("/logout")) 은 /logout 끝점을 간단한 POST 요청으로 호출합니다.
  • with(csrf()) 는 예상되는 _csrf 매개변수를 쿼리에
  • status() 는 HTTP 응답의 상태 코드를 반환합니다.
  • jsonPath() 를 사용하면 HTTP Response body에 액세스하고 검사할 수 있습니다.

5. 결론

요약하자면, Spring Security 및 Spring Boot에서 로그아웃 리디렉션을 비활성화하는 문제를 해결하는 방법을 설명하고 설명했습니다.

평소와 같이 이 기사의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Security footer banner