Spring Security 에서 세션 제어를 위해 인증 api를 추가해줘야 한다.
아래와 같이 HttpSecurity 의 .sessionManagement() 를 사용해 세션 관리 기능이 동작한다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.and()
.sessionManagement()
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
.invalidSessionUrl("/invalid")
.expiredUrl("/expired");
}
}
http.sessionManagement()
세션관리를 위한 세션관리 세부 기능을 동작시키기 위해 설정한다.
.maximumSessions(1)
동시 최대 허용 가능 세션 수를 설정한다. 1을 설정했기 때문에 1개까지 세션이 같은 계정에 최대치로 생성된다.
-1 로 설정할 경우 무제한 로그인 세션이 허용된다.
maxSessionPreventsLogin(true)
동시 로그인을 차단하기 위한 설정이다. true 로 설정했을 경우 로그인 되어 있는 사용자가 있을 경우
로그인을 시도한 사람은 로그인을 할 수가 없다.
기본값은 false 값이며 false 로 설정했을 때 기존 로그인한 사용자는 세션이 만료된다.
세션 제어를 할때 동시 세션 제어는 2가지 방법이 있다.
로그인 시 이미 로그인된 사용자를 만료 시키고 로그인 하는 방법과
이미 로그인 된 사용자가 있으면 로그인 시 인증 실패를 시키는 방법이 있다.
maxSessionPreventsLogin() 설정에서 false 로 설정할 경우 첫번째 방법인 이전 사용자 세션이 만료되고
true 로 설정하면 이미 로그인한 사용자가 있을 경우 로그인에 실패하게 된다.
.invalidSessionUrl("/invalid")
세션이 유효하지 않을 때 이동할 페이지를 설정한다.
.expiredUrl("expired")
세션이 만료된 경우 이동할 페이지를 설정한다.
위 invalidSessionUrl과 함께 expiredUrl 도 설정하게 되면 invalidSessionUrl()이 우선순위가 되어
"/invalid" 로 이동하게 된다.
위 예시는 아래와 같다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.and()
.sessionManagement()
.maximumSessions(1)
.maxSessionsPreventsLogin(true);
}
}
위처럼 보안설정을 진행하는데 session 의 최대 개수는 1개이다.
.maxSessionsPreventsLogin(true) 을 true 설정했기 때문에 이미 로그인된 계정은 세션 최대 개수로 인해
로그인하지 못한다.
1. 현재 사용자 세션 인증 실패
사용자1
사용자2
위처럼 사용자1을 로그인한 후 다른 브라우저에서 로그인을 시도했지만 최대 세션 개수로 인해 로그인하지 못한다.
2. 이전 사용자 세션 만료
사용자1
사용자2
사용자2에서 먼저 로그인을 한 후 사용자 1에서 로그인을 하면 사용자 1은 정상적으로 로그인이 된다.
하지만 사용자2에서 다시 웹페이지를 요청했을 때 세션 만료로 인해 해당 페이지로 이동할 수 없게 된다.
동시 세션제어를 처리하는