새소식

반응형
Java/Spring

Spring Security 정리하기 (#3 세션 제어)

  • -
반응형

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에서 다시 웹페이지를 요청했을 때 세션 만료로 인해 해당 페이지로 이동할 수 없게 된다.

 

 

동시 세션제어를 처리하는

 

반응형
Contents

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

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