8.6 로그아웃 구현

SummerToday·2024년 2월 26일
1
post-thumbnail
post-custom-banner

컨트롤러 구현

// 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>
  • 블로그 글 목록 뷰 파일 articleList.html에 로그아웃 버튼을 추가한다.



해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
신선영, ⌜스프링 부트 3 벡엔드 개발자 되기 - 자바 편⌟, 골든래빗(주), 2023, 384쪽
profile
IT, 개발 관련 정보들을 기록하는 장소입니다.
post-custom-banner

0개의 댓글