세션 고정 보호

1. 세션 고정 보호 설정

공격자가 먼저 서버에 접속해서 받은 세션(a)으로

원래 그 계정의 사용자가 서버에 접속하기 전에 세션을 (a)로 바꾸고 로그인을 할 시,

공격자가 같은 세션(a)으로 로그인없이 서버에 접속할 수 있다.

이를, 방지해주는 것이 sessionManagement 이다.

여기서 .sessionManagement().changeSessionId() 를 쓴다면 공격자가 사용자의 세션을 아무리 바꿔도

사용자가 로그인을 할 시 세션을 그대로 사용하지 않고 바꾸기 때문에 공격자가 같은 세션으로 접속을 해도 접속 할 수가 없다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain fileterChain(HttpSecurity http) throws Exception {

        http
            .sessionManagement(form ->
                form
                    .sessionFixation()
                    .changeSessionId() // <<와 .none(), .migrateSession(), .newSession() 이렇게 4개 버전이 있다. changeSessionId가 default이다.
                    // .none() 은 무방비 상태로 공격을 당할 수 있다.
                    // .changeSessionId() 는 공격에서 자유로울 수 있다.
                    .sessionCreationPolicy(SessionCreationPolicy.ALWAYS) // 스프링 시큐리티가 항상 세션 생성
                    .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 스프링 시큐리티가 필요시 생성 (default)
                    .sessionCreationPolicy(SessionCreationPolicy.NEVER) // 스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않음
            );

        
        return http.build();
    }
}

Comments