회원가입/로그인에 이어서 로그아웃 기능을 구현해봅시다.
SecurityConfig 수정
@Override
protected void configure(HttpSecurity http) throws Exception {
//...
.and()
.logout()
.logoutSuccessUrl("/") // 로그아웃 성공시 리다이렉트 주소
.invalidateHttpSession(true); // 로그아웃 이후 세션 전체 삭제 여부
}
config 파일에 로그아웃 기능을 추가해줍시다. 스프링 시큐리티가 참 좋아요. 이렇게 직관적인 메서드들을 제공해주므로 그대로 써줍시다.
로그아웃 관련 메서드들 정리
logoutSuccessUrl("URL")
redirect할 주소를 적어줍니다. html같은 페이지 단위 주소로 알고 있습니다.
.logoutUrl("URL")
Spring Security의 다른 기본값과 마찬가지로 로그아웃 메커니즘을 실제로 트리거하는 URL 디폴트값 '/logout'이 있습니다. 그러나 응용프로그램 보안을 위해 사용되는 프레임워크에 대한 정보가 게시되지 않도록 하려면 이 기본값을 변경하는 것이 좋습니다.
CSRF 보호가 활성화된 경우(기본값) 요청도 POST여야 합니다. 즉 트리거하려면 기본적으로 POST "/logout"이 필요합니다.
어떤 url로 요청이 들어오면 logout을 실행할지의 트리거로 생각했습니다만 저는 적용하지 못했습니다. POST 요청이 아니라 단순히 GET으로 보내진듯해서 임시방편으로 다른 방식을 이용해 logout을 구현했습니다.
invalidateHttpSession & deleteCookies
말그대로 세션과 쿠키를 지우는 메서드입니다.
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
위의 코드처럼 활용이 가능합니다.
logoutSuccessHandler
사용할 LogoutSuccessHandler를 설정합니다. 이 옵션을 지정하면 logoutSuccessUrl(String)이 무시됩니다. 조금은 복잡한 로직을 적용해야될때 주로 호출하는 메서드라고 합니다.
UserController 수정
@GetMapping("/user/logout")
public String logoutPage(HttpServletRequest request, HttpServletResponse response) {
new SecurityContextLogoutHandler().logout(request, response, SecurityContextHolder.getContext().getAuthentication());
return "redirect:/";
}
제가 언급한 우회 방식입니다. 아예 컨트롤러에서 매핑을 받고, 이걸 로그아웃 기능으로 돌려버리는 거죠. 잘 보시면 POST가 아니라 GET을 사용한 점도 주의해주세요.
여기까지 해주시면 spring security를 이용한 logout 기능 구현은 모두 끝났습니다. 저는 이제 여러가지 고민이 되네요. 세션을 이용해서 보여지는 화면을 달리 처리할지 아니면 그냥 싹다 페이지를 따로 만들어버릴지.. 일단은 후자로 테스트를 해보고 다음에 세션을 도입해보겠습니다. 감사합니다.
참고
스프링 시큐리티 api 문서
'web > spring&spring boot' 카테고리의 다른 글
[spring boot] 스프링 부트 게시판 등록 구현하기(2) (0) | 2021.05.19 |
---|---|
[spring/spring boot] 스프링 부트 회원가입 후 자동로그인 기능 구현하기 (0) | 2021.05.17 |
[spring boot] 로그인 기능 구현하기 (0) | 2021.04.25 |
[spring boot] 회원가입 기능 구현하기(2) - SecurityConfig 작성 (0) | 2021.04.23 |
[spring boot] spring security를 이용한 회원가입 기능 구현 (0) | 2021.04.22 |