1. 소개

Spring Security는 Spring 기반 애플리케이션 Security을위한 표준입니다. 로그인 및 로그 아웃을 포함하여 사용자의 인증을 관리하는 여러 기능이 있습니다. 

이 예제에서는 Spring Security를 ​​사용한 수동 로그 아웃에 초점을 맞출 것 입니다.

독자가 이미 표준 Spring Security 로그 아웃 프로세스를 이해하고 있다고 가정합니다 . 

2. 기본 로그 아웃

때  사용자가 로그 아웃을 시도, 그것은 현재의 세션 상태에 대한 몇 가지 결과를 초래한다 . 두 단계로 세션을 삭제해야합니다.

  1. HTTP 세션 정보를 무효화합니다.
  2. 인증 정보를 포함하므로 SecurityContext지우십시오 .

이 두 작업은 SecurityContextLogoutHandler에 의해 수행됩니다 .

실제로 작동하는지 살펴 보겠습니다.

@Configuration
public class DefaultLogoutConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .logout(logout -> logout
            .logoutUrl("/basic/basiclogout")
            .addLogoutHandler(new SecurityContextLogoutHandler())
          );
    }
}

SecurityContextLogoutHandler 는 기본적으로 Spring Security에 의해 추가 된다는 점에 유의  하십시오. 여기서는 명확성을 위해 보여줍니다.

3. 쿠키 삭제 로그 아웃

종종 로그 아웃은 사용자 쿠키의 일부 또는 전체를 삭제해야하는 경우도 있습니다.

모든 쿠키를 반복하고 로그 아웃시 만료되는 자체 LogoutHandler만들 수 있습니다 .

@Configuration
public class AllCookieClearingLogoutConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .logout(logout -> logout
            .logoutUrl("/cookies/cookielogout")
            .addLogoutHandler((request, response, auth) -> {
                for (Cookie cookie : request.getCookies()) {
                    String cookieName = cookie.getName();
                    Cookie cookieToDelete = new Cookie(cookieName, null);
                    cookieToDelete.setMaxAge(0);
                    response.addCookie(cookieToDelete);
                }
            })
          );
    }
}

반면에 Spring Security는 쿠키 제거를 위해 즉시 사용 가능한 로그 아웃 핸들러 인 CookieClearingLogoutHandler제공합니다 .

4. Clear-Site-Data 헤더 로그 아웃

또는 특별한 HTTP 응답 헤더를 사용하여 동일한 결과를 얻을 수 있습니다. 여기서 Clear-Site-Data  헤더 가 작동합니다. 지우기 - 데이터 - 사이트 요청하는 웹 사이트와 관련된 데이터를 검색 헤더 웁니다 (쿠키, 저장, 캐시) :

@Configuration
public class ClearSiteDataHeaderLogoutConfiguration extends WebSecurityConfigurerAdapter {

    private static final ClearSiteDataHeaderWriter.Directive[] SOURCE = 
      {CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS};

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .logout(logout -> logout
            .logoutUrl("/csd/csdlogout")
            .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE)))
          );
    }
}

참고 우리가 기억의 한 유형을 취소 할 때 응용 프로그램 상태가 손상 저장 클렌징 힘을. 따라서 Incomplete Clearing 으로 인해 헤더는 요청이 안전한 경우에만 적용됩니다.

5. 결론

Spring Security에는 인증 시나리오를 처리하기위한 많은 내장 기능이 있습니다. 이러한 기능을 프로그래밍 방식으로 사용하는 방법을 익히는 것은 항상 편리합니다.

항상 그렇듯이 이러한 예제의 코드는 GitHub에서 사용할 수  있습니다 .