새소식

반응형
Java/Spring

[Spring Security] logout 설정 2가지

  • -
반응형

Spring Security 에서 로그아웃을 하기 위해선 2가지 방법이 있다. 다른방법이 있을지 모르겠지만

본인이 사용했던 방법은 2가지다.

.logoutUrl("URL")  과 .logoutRequestMatcher() 방법이다.

 

처음 설정할땐 .logoutUrl 을 사용했었으나 csrf() 설정 여부에 따라 GET 방식, POST 방식 요청이 달라져

logoutRequestMatcher() 로 설정했다.

기본적으로 logoutUrl 은 "/logout" 으로 설정되어 있다.

아무 설정도 안했을 땐 /logout 으로 요청 시 로그아웃이 된다.

여기서 달라지는건 CSRF 활성화 여부이다.

 

 

아래는 Spring Security 의 logoutUrl 메서드이다.

 

먼저 주석내용을 구글번역기에 돌려보면 아래와 같다.

/**
 * The URL that triggers log out to occur (default is "/logout"). If CSRF protection
 * is enabled (default), then the request must also be a POST. This means that by
 * default POST "/logout" is required to trigger a log out. If CSRF protection is
 * disabled, then any HTTP method is allowed.
 *
 * <p>
 * It is considered best practice to use an HTTP POST on any action that changes state
 * (i.e. log out) to protect against
 * <a href="
https://en.wikipedia.org/wiki/Cross-site_request_forgery">CSRF

 * attacks</a>. If you really want to use an HTTP GET, you can use
 * <code>logoutRequestMatcher(new AntPathRequestMatcher(logoutUrl, "GET"));</code>
 * </p>
 * @param logoutUrl the URL that will invoke logout.
 * @return the {@link LogoutConfigurer} for further customization
 * @see #logoutRequestMatcher(RequestMatcher)
 * @see HttpSecurity#csrf()
 */

 

해석
/** *
로그아웃이 발생하도록 트리거하는 URL(기본값은 "/logout")입니다. CSRF 보호의 경우 *가 활성화되면(기본값) 요청도 POST여야 합니다. 이것은 다음을 의미합니다. * 기본 POST "/logout"은 로그아웃을 트리거하는 데 필요합니다. CSRF 보호가 * 비활성화되면 모든 HTTP 메서드가 허용됩니다. * * <p> * 상태를 변경하는 모든 작업에 HTTP POST를 사용하는 것이 모범 사례로 간주됩니다. * (즉, 로그아웃) * <a href="https://en.wikipedia.org/wiki/Cross-site_request_forgery">CSRF * 공격</a>. HTTP GET을 실제로 사용하려면 다음을 사용할 수 있습니다. * <code>logoutRequestMatcher(new AntPathRequestMatcher(logoutUrl, "GET"));</code> * </p> * @param logoutUrl 로그아웃을 호출할 URL. * 추가 사용자 정의를 위해 @return {@link LogoutConfigurer}를 반환합니다. * @see #logoutRequestMatcher(RequestMatcher) * @HttpSecurity#csrf() 참조 */

 

위 내용을 보면 Spring Security의 기본 Logout URL은 "/logout" 이라고 한다.

CSRF 설정이 활성화(enable) 되어 있으면 요청은 POST 여야 하고 비활성화면 모든

HTTP 메서드(GET, POST, PUT 등) 가 허용된다고 합니다. HTTP GET을 실제로 사용하기 위해선 위 내용처럼

logoutRequestMatcher(new AntPathRequestMatcher(logoutUrl, "GET")); 을 사용하라고 합니다.

 

그래서 맨 위 이미지처럼 아래와 같이 수정했습니다.

.logout()
    .logoutRequestMatcher(new AntPathRequestMatcher("/auth/logout"))
    //.logoutUrl("/auth/logout")
    .logoutSuccessUrl("/main")
    .invalidateHttpSession(true)

 

.logoutRequestMatcher(new AntPathRequestMatcher("/auth/logout")) 처럼 마지막에 "GET"을 빼도 됩니다.

 

AntPathRequestMatcher 에 들어가보면 아래와 같습니다.

메서드 위 주석 설명을 구글번역기 돌려보면 

모든 HTTP 메서드와 일치하는 특정 패턴으로 매처를 생성합니다.

라고 합니다. HTTP 메서드를 표시하지 않으면 기본적으로 null 로 들어가며 모든 HTTP 메서드와 일치하는

특정 패턴으로 매처를 생성한다.

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.