SpringSecurity - 로그아웃 구현

박민수·2023년 11월 14일
0

Spring

목록 보기
35/46
post-thumbnail

SpringSecurity - 로그아웃 구현

해당 포스팅에서는 SpringSecurity를 이용해서 로그아웃 기능을 구현하는 방법에 대해서 정리해 보고자 한다.

SpringSecurity에서 로그아웃을 구현하기 위한 방법에는 2가지가 있다.

  1. form 태그를 이용하여 POST로 요청
  2. a 태그를 이용하여 GET으로 요청 (SecurityContextLogoutHandler 이용)

인증 여부 확인 표현식

thymeleaf에서 SpringSecurity와 통합하여 사용자의 인증 여부를 확인할 수 있도록 제공하는 라이브러리가 존재한다. 이를 활용하여 인증을 하지 않은 사용자에게는 로그인 메뉴를 보여주고, 인증을 한 사용자에게는 로그아웃 메뉴를 보여주도록 설정할 수 있다.

해당 기능을 사용하기 위해서는 별도로 라이브러리를 추가해야 하고, html 파일에 name space를 추가해야 한다. 이는 네임스페이스에서 특정 타임리프의 문법을 사용할 것을 선언하는 것이다.

dependency 추가

implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'

view.html

<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>

표현식은 아래와 같다.

  • sec:authorize="isAnonymous()" 익명 사용자가 접속한 경우 해당 태그를 노출한다.
  • sec:authorize="isAuthenticated()" 인증된 사용자에게만 해당 태그를 노출한다.

로그아웃 처리 기능 설정

html에서 설정한 링크로 접속했을 때 로그아웃 처리 기능이 작동하도록 Controller에서 구현을 해야 한다. SecurityContextLogoutHandler 클래스를 이용하여 로그아웃 기능을 구현할 수 있다.
해당 클래스는 3개의 인자를 받는다.

  1. HttpServletRequest
  2. HttpServletResponse
  3. authentication(인증 객체)
@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";
    }
}
profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글