로그아웃은 스프링 시큐리티에서 제공하는 기능으로 구현
-> logout()메서드 : Spring Security의 기본 로그아웃 처리를 설정하는 메서드
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// 모든 페이지에 대한 접근권한 설정, 사이트 위변조 방지 해제
http //authorizeHttpRequests 어떤 요청에 대해 어떤 권한이 필요한지 설정
.authorizeHttpRequests(auth -> auth
//.requestMatchers : 특정 URL 지정
// 인증 없이 접근 가능
.requestMatchers("/css/**", "/js/**", "/images/**", "/fonts/**", "/scss/**").permitAll() // 정적 리소스
.requestMatchers("/", "/sms/send", "/signin", "/signup", "/idcheck", "/signform", "/lostpass", "/find-userId", "find-password", "/logout-success").permitAll()
... 이하 코드 생략
)
// 보안상의 이유로 다른 도메인에서 온 요청 차단
// CSRF 비활성화 -> 모든 도메인의 요청 허용
.csrf(AbstractHttpConfigurer::disable)
.logout((logout) -> logout
.logoutUrl("/logout")
.permitAll()
.deleteCookies("Authorization")
.addLogoutHandler((request, response, authentication) -> {
Cookie accessCookie = new Cookie("Authorization", null);
accessCookie.setPath("/");
accessCookie.setDomain("localhost");
accessCookie.setHttpOnly(true);
accessCookie.setMaxAge(0);
response.addCookie(accessCookie);
})
.logoutSuccessHandler((request, response, authentication) -> {
response.sendRedirect("/logout-success");
}))
... 이하 코드 생략
}
- .logoutUrl("/logout") : /logout 경로로 로그아웃 요청이 발생하도록 설정
- .permitAll() : 로그인 여부와 상관없이 로그아웃 URL에 접근할 수 있도록 허용
- .deleteCookies("Authorization") : Authorization"이라는 이름의 쿠키를 삭제 -> 쿠키에 JWT토큰을 담았으므로 로그아웃 시 내가 설정한 이름의 쿠키를 제거하여 세션을 만료
- .addLogoutHandler() : 로그아웃 시 특정 동작을 정의하는데 사용하는 인터페이스 -> 쿠키를 수동으로 생성하고, 그 값을 null로 설정한 뒤, setMaxAge(0)로 유효 기간을 0으로 설정해 즉시 만료시키는 방식
- .logoutSuccessHandler() : 로그아웃 핸들 -> 로그아웃 성공시 동작
블로그를 작성하면서 코드를 다시 보니 동일한 기능을 구현하는 코드가 중복으로 작성되어 있었다.
->.deleteCookies("Authorization")와 .addLogoutHandler() 내의 쿠키 삭제 로직은 동일한 목적(쿠키 삭제)을 갖고 있으므로, 둘 중 하나는 없어도 로그아웃이 구현 되었다!....
나는 중복 코드중 .addLogoutHandler() 를 제거하여 간단하게 처리를 했다.
- /logout-success 경로로 리다이렉트 ( 로그아웃 메세지 )
// 로그아웃 메세지
@GetMapping("/logout-success")
public String logoutSuccess(Model model) {
model.addAttribute("logoutMessage", "로그아웃 되었습니다.");
return "index";
}
로그아웃 성공 후 사용자를 /logout-success URL로 리다이렉트하여 메시지를 처리하는 컨트롤러 메서드를 설정했고,
logoutMessage라는 이름의 모델 속성에 로그아웃 메시지를 추가하고, 메인페이지(index)로 리다이렉트한다.
즉, 아래 이미지와 같이 사용자에게 로그아웃 메시지를 표시하고, 메인 화면으로 이동하는 기능이다!
