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에 액세스할 수 있습니다.