Spring Security 중복 로그인 방지하는 방법
2023. 7. 13. 14:05ㆍ카테고리 없음
반응형
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");
}
}
- sessionFixation().changeSessionId(): 세션 고정 보호
- maximumSessions(1): session 허용 갯수. 중복 로그인을 차단하려면 무조건 1
- maxSessionsPreventsLogin(true): session 허용 갯수 초과시 동작
- true: 나중에 로그인 한 사용자 차단
- false: 먼저 로그인 한 사용자 로그아웃 처리
- logoutRequestMatcher(new AntPathRequestMatcher("/login/logout")): 로그아웃 요청 시 사용할 URL
- logoutSuccessHandler(logoutSuccessHandler): 로그아웃 성공 시 사용할 핸들러
- invalidateHttpSession(true): 세션 초기화
- clearAuthentication(true): 인증정보 초기화
- 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());
}
}
반응형