springframework/시작하자SpringSecurity

29.Logout 화면과 보안처리

Jungsoomin :) 2020. 9. 28. 01:36

로그 아웃 요청POST 요청GET 요청으로 받는다.

  1. POST : form태그
  2. GET : a태그 - SecurityContextLogoutHandler 사용

인증여부에 따른 SpringSecurity Tag 사용법

  • <li sec:authorize="isAnonymous()"> <a>로그인</a></li>
  • <li sec:authorize="isAuthenticated()"><a>로그아웃</a></li>

ThymeLeaf 기준.

 

등록할 의존 : thymeleaf-extras-springsecurity5

<dependency>
  <groupId>org.thymeleaf.extras</groupId>
  <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

 

정의할 xmlns : www.thymeleaf.org/thymeleaf-extras-springsecurity5

<html lang="ko" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">

 

접두사인 sec 를 이용, authorize="" < isAnonymous() , isAuthenticated()인증여부 판단

<li class="nav-item" sec:authorize="isAnonymous()"><a class="nav-link text-light" th:href="@{/login}">로그인</a></li>
<li class="nav-item" sec:authorize="isAnonymous()"><a class="nav-link text-light" th:href="@{/users}">회원가입</a></li>
<li class="nav-item" sec:authorize="isAuthenticated()"><a class="nav-link text-light" th:href="@{/logout}">로그아웃</a></li>

LogoutController 설정

 

깊게 봐야 할 점은 Authentication 객체를 SecurityContextHolder에서 SecurityContext를 꺼내서 가져온다는 점

 

Authentication 객체가 null 이 아니라면 (있다면) SecurityContextLogoutHandler 객체를 생성하여 .logout() 메서드를 이용Session Authencationnull로 만드는 점

@GetMapping("/logout")
    public String logout(HttpServletRequest request, HttpServletResponse response){

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();// SecurityContextHolder 에서 Authentication 객체 추출

        if(authentication != null){
            new SecurityContextLogoutHandler().logout(request, response, authentication);//Authentication 객체 존재시 SecurityContextLogoutHandler 가 session 과  authentication 객체 삭제
        }

        return "redirect:/";
    }