1. 개요

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

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

2. Spring Security에서 로그 아웃

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

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

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

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

3. 스프링 Security 로그 아웃 리디렉션 비활성화

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

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

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

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

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

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

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(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);
                }
            );
    }

}

위 구성에서 주목해야 할 중요한 부분은 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 응답의 본문에 액세스하고 검사 할 수 있습니다.

5. 결론

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

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