SPRING/스프링 시큐리티

세션 정책 및 고정세션 공격방지

JUMP개발자 2021. 8. 3. 10:51

스프링 시큐리티에서는 세션 관련 정책을 설정할 수 있다.

하나의 계정에 최대 몇개의 세션을 유지할 것인지, 새로운 사용자가 접근하면 로그인을 금지할 것인지 아니면 기존 사용자를 로그아웃 시킬 것인 지 등 정책 설정이 필요하다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 모든 리소스에 대한 인증완료시 접근 허용
        http
                .authorizeRequests()
                .anyRequest().authenticated();
        // form Login  사용
        http
                .formLogin();
        // 세션 정책 (최대 세션 개수 1개로 설정 및 해당 횟수 넘으면 로그인 X)
        http
                .sessionManagement()
                .maximumSessions(1) // 최대 세션 개수 1
                .maxSessionsPreventsLogin(true); // 최대 세션 개수를 초과할 시에 로그인 방지
    }

}

위 설정에서 동일 계정으로 2번 로그인 시 아래와 같은 화면이 나온다.

 

.maxSessionsPreventsLogin(false); 로 설정시에는 기존 사용자가 세션아웃이 된다.

 

고정세션공격 보호하기

 

공격자가 JESSIONID를 가로채서 Session을 공유하여 공격

-> 사용자에게 접속할때마다 JESSIONID를 발급해서 막음.

 

아무 설정을 하지 않으면 default 값인 changeSessionId로 설정

1. changeSessionId()

- 새로운 세션ID가 발급됨.

- 이전 세션 사용이 가능함.

       http
                .sessionManagement()
                .sessionFixation()
                .changeSessionId()
                .maximumSessions(1);

2. newSession()

- 새로운 세션ID가 발급됨.

- 이전 세션 사용이 불가능함.

        http
                .sessionManagement()
                .sessionFixation()
                .newSession();

3. none()

- 아무설정을 하지 않음. (고정세션 공격이 됨)

http
                .sessionManagement()
                .sessionFixation().none();