Spring/Spring Security

[Spring Security] 3-4. Authentication: logout

noahkim_ 2023. 10. 3. 00:23

1. 로그아웃 아키텍쳐

  • Spring Security는 기본적으로 로그아웃 기능을 지원함
소제목 설명
GET /logout
- 로그아웃 확인 페이지 제공
- CSRF 토큰 포함 가능
※ CSRF 비활성화 시 확인 페이지 없이 바로 로그아웃
POST /logout
- 로그아웃 처리 동작 수행
① SecurityContextLogoutHandler: 세션 무효화
② SecurityContextLogoutHandler: SecurityContext 제거
③ TokenRememberService: RememberMe 제거
④ CsrfLogoutHandler: CSRF 토큰 제거
⑤ LogoutSuccessEventPublishingLogoutHandler: LogoutSuccessEvent 발행
→ /login?logout 으로 리디렉션됨

 

2. 로그아웃 URIs 설정

  • LogoutFilter는 AuthorizationFilter 전에 위치합니다
  • 로그아웃 URI의 인가 작업이 필요하지 않습니다.

 

로그아웃 엔드포인트

  • 명시적으로 permitAll() 지정 필요

 

예시) logoutUrl

더보기
더보기
http.logout((logout) -> logout.logoutUrl("/my/logout/uri"))

 

로그아웃 성공 후 리다이렉트

  • 리다이렉트 URI의 인가를 열어주기

예시) logoutSuccessUrl()

더보기
더보기
http
    .logout((logout) -> logout
        .logoutSuccessUrl("/my/success/endpoint")
        .permitAll()
    )

 

3. 로그아웃 핸들러

LogoutHandler

  • 로그아웃 로직을 추가할 수 있음

 

예) 쿠키 삭제

더보기
더보기
http.logout(logout -> logout
		.addLogoutHandler(new CookieClearingLogoutHandler("my-cookie")));

 

예) 브라우저 데이터 삭제 (Clear-Site-Data 헤더) 

더보기
더보기

전체 데이터 삭제 (캐시, 스토리지, 쿠키 등)

http.logout(logout -> logout
		.addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(Directive.ALL)));

 

쿠키만 삭제

http.logout(logout -> logout
		.addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(Directive.COOKIES)));

 

LogoutSuccessHandler

  • 로그아웃 이후 후처리 담당
  • 예) 상태 반환 등

 

예시) logoutSuccessHandler

더보기
더보기
http.logout(logout -> logout
	        .logoutUrl("/v1/logout")
                .logoutSuccessUrl("/v1/login")
                .logoutSuccessHandler(logoutSuccessHandler)
        )

 

4. 다양한 기능

쿠키 삭제

예) deleteCookies

더보기
더보기
http.logout(logout -> logout.deleteCookies("my-cookie"));

 

5. 주의사항

Spring MVC 스타일로 로그아웃 구현

  • SecurityContextLogoutHandler.logout() 호출 필수 (생략 시 실제로 로그아웃 되지 않음)

 

예시

더보기
더보기
@PostMapping("/my/logout")
public String logout(HttpServletRequest request,
                     HttpServletResponse response,
                     Authentication auth) {
    SecurityContextLogoutHandler handler = new SecurityContextLogoutHandler();
    handler.logout(request, response, auth);
    return "redirect:/home";
}

 

 

참고