이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
로그아웃 및 인증에 따른 화면 보안 처리
Form 인증 - 로그아웃 및 화면 보안 처리
로그아웃 방법
- <form> 태그를 사용해 POST로 요청
- <a> 태그를 사용해 GET으로 요청 - SecurityContextLogoutHandler 활용
인증 여부에 따라 로그인/로그아웃 표현
- <li sec:authorize="isAnonymous()"><a th:href="@{/login}">로그인</a></li>
- <li sec:authorize="isAnonymous()"><a th:href="@{/logout}">로그아웃</a></li>
- 타임리프는 스프링 시큐리티의 보안과 관련된 표현식을 제공하는데 이 표현식을 사용하기 위해서는 dependency 와 네임 스페이스를 추가해야 한다.
구현
top.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf-extras-springsecurity5">
<div th:fragment="header">
<nav class="navbar navbar-dark sticky-top bg-dark ">
<div class="container">
<a class="text-light" href="#"><h4>Core Spring Security</h4></a>
<ul class="nav justify-content-end">
<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>
<li class="nav-item" ><a class="nav-link text-light" href="/">HOME</a></li>
</ul>
</div>
</nav>
</div>
</html>
- 타임리프에서 제공하는 스프링 시큐리티 보안 표현식을 사용하기 위해 sec라는 이름의 네임 스페이스를 하나 추가한다.
- 로그아웃 페이지로 이동할 수 있도록 <a>태그를 하나 추가한다.
- 로그인, 회원가입 페이지는 익명 사용자가 접근할 수 있도록 isAnonymous()로 검사하고 로그아웃은 이미 인증을 받은 사용자만이 접근할 수 있도록 isAuthenticated()를 통해 검사한다.
- HOME페이지는 누구든 접근 가능해야 하므로 변경하지 않는다.
LoginController
- 로그아웃 페이지에 GET 방식으로 접근할 수 있도록 컨트롤러 하나를 추가한다.
- 로그아웃을 수행하기 위해 SecurityContextLogoutHandler 클래스를 사용한다.
- 3개의 인자를 사용해야 한다.
- HttpServletRequest
- HttpServletResponse
- Authentication 객체
- 로그아웃을 수행한다는 것은 사용자의 인증 객체가 SecurityContext 내부에 존재한다는 것을 의미한다.
- 3개의 인자를 사용해야 한다.
@Controller
public class LoginController {
...
@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";
}
}
실행
- 처음 루트 페이지에 접속하면 로그아웃을 제외한 로그인, 회원가입, HOME 페이지로 이동할 수 있는 <a> 태그가 존재한다.
- 미리 생성한 user 계정으로 로그인 후 루트 페이지로 이동하면 로그인, 회원가입이 사라지고 로그아웃이 생성된 것을 확인할 수 있다.
'스프링 시큐리티 > 실전프로젝트 - 인증 프로세스 Form 인증 구현' 카테고리의 다른 글
인증 성공 핸들러: CustomAuthenticationSuccessHandler (0) | 2023.02.12 |
---|---|
인증 부가 기능 - WebAuthenticationDetails, AuthenticationDetailsSource (0) | 2023.02.12 |
커스텀 로그인 페이지 생성하기 (0) | 2023.02.11 |
DB 연동 인증 처리(2): CustomAuthenticationProvider (0) | 2023.02.11 |
DB 연동 인증 처리(1): CustomUserDetailsService (0) | 2023.02.11 |