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에서 로그 아웃 리디렉션을 비활성화하는 문제를 해결하는 방법을 설명하고 설명했습니다.
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-security-disable-logout-redirects
'Java' 카테고리의 다른 글
Spring Security의 AuthenticationManagerResolver 사용방법(예제) (0) | 2021.04.11 |
---|---|
Spring Security를 사용한 수동 로그 아웃 (0) | 2021.04.11 |
Spring Security를 사용하여 Amazon Cognito로 인증 (0) | 2021.04.11 |
Spring Security 5 – OAuth2 로그인 (0) | 2021.04.10 |
Spring Security 5.1 클라이언트로 권한 부여 및 토큰 요청 사용자 지정 (0) | 2021.04.10 |