back end/java

Spring Security 중복 로그인 방지하는 방법

노루아부지 2023. 2. 14. 15:32
반응형

1. SecurityConfig에 다음과 같이 추가

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    /* 중간 생략 */
    
    http
        .sessionManagement()
        .sessionFixation().changeSessionId()
        .maximumSessions(1)
        .maxSessionsPreventsLogin(true)
    ;
    
    http.logout()
        .logoutRequestMatcher(new AntPathRequestMatcher("/login/logout"))
        .invalidateHttpSession(true)
        .clearAuthentication(true)
        .deleteCookies("JSESSIONID", "remember-me");
  }
}

 

  1. sessionFixation().changeSessionId(): 세션 고정 보호
  2. maximumSessions(1): session 허용 갯수. 중복 로그인을 차단하려면 무조건 1
  3. maxSessionsPreventsLogin(true): session 허용 갯수 초과시 동작
    1. true: 나중에 로그인 한 사용자 차단
    2. false: 먼저 로그인 한 사용자 로그아웃 처리
  4. logoutRequestMatcher(new AntPathRequestMatcher("/login/logout")): 로그아웃 요청 시 사용할 URL
  5. logoutSuccessHandler(logoutSuccessHandler): 로그아웃 성공 시 사용할 핸들러
  6. invalidateHttpSession(true): 세션 초기화
  7. clearAuthentication(true): 인증정보 초기화
  8. deleteCookies("JSESSIONID", "remember-me"): 쿠키 삭제

 

 

2. @Bean 추가

1번 설정을 진행한 후에 로그아웃을 해도 로그아웃 처리가 제대로 되지 않아 다른 브라우저에서 로그아웃이 차단되는 현상이 발생합니다.

이 문제를 해결하기 위해 SecurityConfig에 httpSessionEventPublisher 메소드를 추가하여 @Bean 등록을 합니다.

 

완성된 결과물은 다음과 같습니다.

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    /* 중간 생략 */
    
    http
        .sessionManagement()
        .sessionFixation().changeSessionId()
        .maximumSessions(1)
        .maxSessionsPreventsLogin(true)
    ;
    
    http.logout()
        .logoutRequestMatcher(new AntPathRequestMatcher("/login/logout"))
        .invalidateHttpSession(true)
        .clearAuthentication(true)
        .deleteCookies("JSESSIONID", "remember-me");
  }
  
  @Bean
  public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
    return new ServletListenerRegistrationBean<>(new HttpSessionEventPublisher());
  }
}

 

 

출처: https://www.novasky.net/1638

 

springboot 2.x spring security 중복로그인 방지, logout 시 session 삭제 안될때 처리

출처 : aljjabaegi.tistory.com/508 springboot 2.x spring security 중복로그인 방지, logout 시 session 삭제 안될때 처리 springboot 2.x spring security 중복로그인 방지, logout 시 session 삭제 안될때 처리 기본적인 로그인

www.novasky.net

 

728x90
반응형
loading