
해당 포스팅에서는 SpringSecurity를 이용해서 로그아웃 기능을 구현하는 방법에 대해서 정리해 보고자 한다.
SpringSecurity에서 로그아웃을 구현하기 위한 방법에는 2가지가 있다.
thymeleaf에서 SpringSecurity와 통합하여 사용자의 인증 여부를 확인할 수 있도록 제공하는 라이브러리가 존재한다. 이를 활용하여 인증을 하지 않은 사용자에게는 로그인 메뉴를 보여주고, 인증을 한 사용자에게는 로그아웃 메뉴를 보여주도록 설정할 수 있다.
해당 기능을 사용하기 위해서는 별도로 라이브러리를 추가해야 하고, html 파일에 name space를 추가해야 한다. 이는 네임스페이스에서 특정 타임리프의 문법을 사용할 것을 선언하는 것이다.
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
...
<li sec:authorize="isAnonymous()"><a th:href="@{/login}">로그인</a></li>
<li sec:authorize="isAuthenticated()"><a th:href="@{/logout}">로그아웃</a></li>
<li sec:authorize="isAnonymous()"><a th:href="@{/users}">회원가입</a></li>
<li class="nav-item"><a href="/">HOME</a></li>
표현식은 아래와 같다.
html에서 설정한 링크로 접속했을 때 로그아웃 처리 기능이 작동하도록 Controller에서 구현을 해야 한다. SecurityContextLogoutHandler 클래스를 이용하여 로그아웃 기능을 구현할 수 있다.
해당 클래스는 3개의 인자를 받는다.
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "user/login";
}
@GetMapping("/logout")
public String logout(HttpServletRequest request, HttpServletResponse response) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
new SecurityContextLogoutHandler().logout(request,response,authentication);
}
return "redirect:/login";
}
}