// controller - UserApiController.java
@RequiredArgsConstructor
@Controller
public class UserApiController {
~ 생략 ~
@GetMapping("/logout")
public String logout(HttpServletRequest request, HttpServletResponse response) {
new SecurityContextLogoutHandler().logout(request, response, SecurityContextHolder.getContext().getAuthentication());
return "redirect:/login";
}
}
SecurityContextLogoutHandler()
Spring Security에서 제공하는 로그아웃을 처리하는 핸들러이다. 해당 메서드는 현재 사용자의 인증 정보를 제거하고 세션을 무효화하는 역할을 한다.
SecurityContextLogoutHandler().logout()
Spring Security에서 제공하는 로그아웃을 처리하는 메서드이다. 웹 애플리케이션에서 사용자가 로그아웃을 요청하면, 이 메서드를 호출하여 사용자의 인증 정보를 제거하고 세션을 만료시킨다.
- 해당 메서드는 다음과 같은 인자들을 가질 수 있다.
- HttpServletRequest
로그아웃 요청을 처리하는 데 필요한 HTTP 요청에 관련된 정보를 제공하기 위해 사용된다. 이 객체를 통해 요청의 헤더, 파라미터, 세션 등의 정보를 읽을 수 있다. 또한, 로그아웃 요청을 받은 경로나 URL 등의 요청 메타데이터를 확인할 수 있다.
- HttpServletResponse
로그아웃 처리 후에 사용자를 리다이렉트하거나 응답을 보낼 때 사용된다. 예를 들어, 로그아웃이 완료되면 사용자를 로그인 페이지로 리다이렉트하여 다시 로그인하도록 안내하거나, 로그아웃 성공 메시지를 출력하거나 기타 작업을 수행할 수 있다.
- Authentication
Spring Security에서 사용자의 인증 정보를 나타내는 인터페이스이다. 이 인터페이스는 사용자의 인증 상태를 나타내는데 사용되며, 인증된 사용자의 정보를 제공한다.
SecurityContextHolder
Spring Security에서 현재 사용자의 보안 컨텍스트를 제공하는 클래스입니다. 이를 통해 현재 사용자의 인증 정보와 권한 정보를 얻을 수 있다.
일반적으로 웹 애플리케이션에서는 사용자가 로그인하고 나면, 해당 사용자의 보안 컨텍스트가 생성되고 SecurityContextHolder에 저장된다. 이후에는 어플리케이션 전반에서 현재 사용자의 보안 컨텍스트를 필요로 할 때마다 SecurityContextHolder를 통해 접근할 수 있다.
SecurityContextHolder.getContext().getAuthentication()
getContext()
SecurityContextHolder의 메서드로, 현재 스레드의 보안 컨텍스트를 반환한다. 스레드마다 별도의 보안 컨텍스트가 관리된다.
getAuthentication()
현재 사용자의 인증 정보를 반환한다. 이를 통해 현재 사용자의 권한, 자격 증명 등의 정보를 액세스할 수 있다.
// resources - templates - articleList.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
~ 생략 ~
<div class="card-body">
<h5 class="card-title" th:text="${item.title}"></h5>
<p class="card-text" th:text="${item.content}"></p>
<a th:href="@{/articles/{id}(id=${item.id})}" class="btn btn-primary">보러가기</a>
</div>
</div>
<br>
</div>
<button type="button" class="btn btn-secondary" onclick="location.href='/logout'">로그아웃</button> <!-- 로그아웃 버튼 추가 -->
</div>
<script src="/js/article.js"></script>
</body>