1. 개요

이 기사는 Form Login 예제 위에 작성 되었으며 Spring Security로 Logout 을 구성하는 방법에 중점을 둘 것 입니다.

2. 기본 구성

logout() 메서드 를 사용하는 Spring 로그아웃 기능 의 기본 구성은 충분히 간단합니다.

@Configuration
@EnableWebSecurity
public class SecSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
          //...
          .logout()
          //...
   }
   //...
}

XML 구성 사용:

<http>

    ...    
    <logout/>

</http>

이 요소는 다음 로그아웃 URL 을 사용하도록 구성된 기본 로그아웃 메커니즘을 활성화합니다 . Spring Security 4 이전 에는 /j_spring_security_logout 이었던 /logout 입니다 .

3. JSP와 로그아웃 링크

이 간단한 예를 계속 하면 웹 애플리케이션에서 로그아웃 링크 를 제공하는 방법 은 다음과 같습니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
   <head></head>
   <body>
      <a href="<c:url value="/logout" />">Logout</a>
   </body>
</html>

4. 고급 사용자 정의

4.1. 로그아웃성공Url()

로그아웃 프로세스가 성공적으로 수행된 후 Spring Security는 사용자를 지정된 페이지로 리디렉션합니다. 기본적으로 이것은 루트 페이지( "/" )이지만 다음과 같이 구성할 수 있습니다.

//...
.logout()
.logoutSuccessUrl("/afterlogout.html")
//...

이는 XML 구성을 사용하여 수행할 수도 있습니다.

<logout logout-success-url="/afterlogout.html" />

애플리케이션에 따라 사용자를 다시 로그인 페이지로 리디렉션하는 것이 좋습니다.

//...
.logout()
.logoutSuccessUrl("/login.html")
//...

4.2. 로그아웃 URL()

Spring Security의 다른 기본값과 마찬가지로 실제로 로그아웃 메커니즘을 트리거하는 URL에도 기본값인 /logout 이 있습니다.

그러나 이 기본값을 변경하여 애플리케이션 Security에 사용되는 프레임워크에 대한 정보가 게시되지 않도록 하는 것이 좋습니다.

.logout()
.logoutUrl("/perform_logout")

그리고 XML을 통해:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout" />

4.3. invalidateHttpSession  및 deleteCookies

이 두 가지 고급 속성은 세션 무효화와 사용자가 로그아웃할 때 삭제할 쿠키 List을 제어합니다. 따라서 invalidateHttpSession  을 사용하면 로그아웃이 발생할 때 세션이 무효화되지 않도록 세션을 설정할 수 있습니다( 기본적으로 true 임).

deleteCookies  메서드도 간단합니다 .

.logout()
.logoutUrl("/perform_logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")

그리고 XML 버전:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID" />

4.4. 로그아웃SuccessHandler()

네임스페이스가 충분히 유연하지 않은 고급 시나리오의 경우 Spring 컨텍스트 의 LogoutSuccessHandler 빈을 사용자 지정 참조로 바꿀 수 있습니다.

@Bean
public LogoutSuccessHandler logoutSuccessHandler() {
    return new CustomLogoutSuccessHandler();
}

//...
.logout()
.logoutSuccessHandler(logoutSuccessHandler());
//...

동등한 XML 구성은 다음과 같습니다.

<logout 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID"
  success-handler-ref="customLogoutSuccessHandler" />

...
<beans:bean name="customUrlLogoutSuccessHandler" />

사용자가 성공적으로 로그아웃할 때 실행해야 하는 사용자 정의 애플리케이션 논리는 사용자 정의 로그아웃 성공 핸들러로 구현할 수 있습니다. 예를 들어 사용자가 로그아웃을 트리거했을 때 마지막 페이지를 추적하는 간단한 감사 메커니즘은 다음과 같습니다.

public class CustomLogoutSuccessHandler extends 
  SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {

    @Autowired 
    private AuditService auditService; 

    @Override
    public void onLogoutSuccess(
      HttpServletRequest request, 
      HttpServletResponse response, 
      Authentication authentication) 
      throws IOException, ServletException {
 
        String refererUrl = request.getHeader("Referer");
        auditService.track("Logout from: " + refererUrl);

        super.onLogoutSuccess(request, response, authentication);
    }
}

또한 이 사용자 정의 빈은 사용자가 로그아웃한 후 이동하는 대상을 결정하는 책임이 있음을 명심하십시오. 이로 인해 logoutSuccessHandler 속성과 logoutSuccessUrl 속성을 페어링하는 것은 작동하지 않을 것입니다. 둘 다 유사한 기능을 포함하기 때문입니다.

5. 결론

이 예제에서는 Spring Security로 간단한 로그아웃 샘플을 설정하는 것으로 시작한 다음 사용 가능한 고급 옵션에 대해 논의했습니다.

이 Spring Logout Tutorial의 구현은 GitHub 프로젝트 에서 찾을 수 있습니다. 이 프로젝트는 Eclipse 기반 프로젝트이므로 그대로 가져오고 실행하기 쉽습니다.

프로젝트가 로컬에서 실행될 때 다음 위치에서 샘플 HTML에 액세스할 수 있습니다.

http://localhost:8080/spring-security-mvc-login/login.html

Security footer banner