Security Filter 로그아웃시 Cookie를 삭제 못하는 에러

Sol's·2023년 1월 30일
0

팀프로젝트

목록 보기
7/25
post-thumbnail

Security Filter의 로그아웃을 사용하여 로그아웃을 하여도 계속 로그인이 되어있는 상황이 발생하였습니다.

왜 로그인이 안되지? 라는 생각과 동시에 여러 추측을 해보았지만 잘 모르겠어서 Security가 제공하는 logout에 대하여 구글검색을 해보았습니다.

protected void configure(HttpSecurity http) throws Exception {
    http.logout()
        .logoutUrl("/로그아웃 URL") //기본 /logout
        .logoutSuccessUrl("/성공시 반환되는/URL") //기본 /login
        .logoutSuccessHandler(customLogoutSuccessHandler)  //핸들러 커스텀 가능
        .invalidateHttpSession(true)
        .deleteCookies("jwt") //세션 제거, 쿠키 제거
        .and()
        ...
} 

위 설정에서 기대했던것은 .deleteCookies입니다.
그런데 생각대로 잘 Cookie가 삭제되지 않았습니다.

우선 Security의 deleteCookies가 잘 작동하지 않는다는것을 알았습니다.

JwtFilter에는 OncePerRequestFilter를 상속받기 때문에 매요청마다 실행됩니다.
이때 cookie가 삭제되지 않으면 계속 SecurityFilter에 Token을 저장하게 됩니다.

그래서 logout기능을 따로 만들어서 Cookie값을 직접 삭제해야겠다고 생각했습니다.

logout기능을 커스텀하여 Cookie값을 삭제하자

주의할점은 Security Filter에서 csrf를 사용한다면 post방식으로 로그아웃 요청을 보내야 한다는 것입니다.
우선 해당 프로젝트는 csrf를 disable로 설정했기 때문에 get요청으로 설정했습니다.

<a type="button" class="btn btn-warning" th:href="@{/view/v1/logout}" sec:authorize="isAuthenticated()">Logout</a>

우선 logout을 클릭하면 /view/v1/logout로 이동하게 설정하였습니다.

  • Controller
 @GetMapping("/view/v1/logout")
    public String logout(HttpServletResponse response) {
        Cookie cookie = new Cookie("jwt", null);
        response.addCookie(cookie);
        return "redirect:/view/v1/crews";
    }
  1. 쿠키값을 삭제하고
  2. 메인페이지로 이동합니다.

아쉬운점

Security Filter의 .deleteCookies를 활용했다면 더 좋았을것 같습니다.
또한 Post방식으로 로그아웃하는것도 csrf를 설정하거나, 다음프로젝트에는 시도해 봐야할것 같습니다.

추가적으로 Security에대한 공부도 저 해야겠다는 생각이 들었습니다.

profile
배우고, 생각하고, 행동해라

0개의 댓글