본문 바로가기

1.프로그래밍/Java

[Spring Security] SessionManagement

728x90
반응형

Spring Security SessionManagement

생성된 계정으로 서버로부터 인증을 받게 되면 서버에 하나의 세션이 생성한다.

다른 브라우저, 또는 다른 PC에서 같은 계정으로 로그인을 할 경우 이전에 서버에 만들어진 세션을 같이 공유하는 것이 아닌 새로운 세션을 생성하여 사용하게 된다.

동시 세션 관리

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .sessionManagement()
            .maximumSessions(1)
            .maxSessionsPreventsLogin(true)
            .expiredUrl("/expiredUrl")

        return http.build();
    }
  • maximumSessions(1) : 최대 허용 가능 세션 수를 설정하는 api이다. (값으로 -1을 넣으면 무제한으로 세션 생성을 허용하게 된다.)

  • maxSessionsPreventsLogin(true) : 위에서 설정한 최대 허용 세션의 수가 되었을 때 추가적인 인증 요청(세션 생성)이 있을 경우 어떻게 처리를 할지 정하는 api이다.(true면 현재 사용자 인증 실패, false(default값)면 기존 세션 만료하게 딘다.)

  • expiredUrl("/expired ") : 세션이 만료된 경우 이동 할 페이지를 정하는 api이다.

최대 세션일 경우 처리 과정

maximumSessions() 설정이 1 일 때의 기준.

이전의 사용자 세션 만료

  1. 사용자 1이 로그인을 하면 서버에 해당 계정에 대한 세션이 생성

  2. 사용자 2가 사용자 1이 로그인 하였던 동일 계정으로 로그인을 시도하게되면 여러 filter중 SessionManageMentFilter에서 maximumSessions()의 값이 1인 것을 확인

  3. 서버는 새롭게 접근을 시도한 사용자 2의 세션을 새로 생성하고 인증을 해주며 사용자 1의 세션은 session.isExpired() == true으로 변경하여 세션 만료 설정

  4. 사용자 1이 다시 request를 요청하면 ConcurrentSessionFilter에서 session.isExpired()값을 확인하여 세선이 만료여부를 확인 후 세션의 만료 여부를 확인 후 새로운 세션을 만들도록 인증을 요청

새로운 사용자 인증 실패

  1. 사용자 1이 로그인을 하면 서버에 해당 계정에 대한 세션이 생성

  2. 사용자 2가 사용자 1이 로그인 하였던 동일 계정으로 로그인을 시도하게되면 여러 filter중 SessionManageMentFilter에서 maximumSessions()의 값이 1인 것을 확인합니다.

  3. 서버에서는 사용자 2의 세션을 생성되지 않고 인증 예외를 발생시킵니다.

ConcurrentSessionFilter : 매 요청마다 사용자 세션의session.isExpired() 여부를 확인하여 세션이 만료로 되어있을 경우 로그아웃처리(만료처리)를 해주는 필터입니다.
SessionManageMentFilter : 동시적 세션제어, 세션 고정 보호, 세션 생성 정책 등의 세션의 전반적인 관리를 해주는 필터입니다.
image

세션 고정 보호

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .sessionManagement()
            .sessionFixation.changeSessionId()

        return http.build();
    }
  • changeSessionId() : 사용자가 인증을 시도하게 되면 사용자 세션은 그대로 두고 세션 아이디만 변경 한다. -> 세션 아이디가 변경되어서 공격자가 갖고있는 세션 아이디는 무용지물이 된다. (3.1 버전 이후 default)

  • newSession() : 새로운 새션과 아이디 생성하며 이전의 설정 값들을 사용 불가.

  • none() : 아무런 보호 X

세션 정책 설정

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.If_Required)            
        return http.build();
    }
  • SessionCreationPolicy.Always : 스프링 시큐리티가 항상 세션 생성.
  • SessionCreationPolicy.If_Required : 스프링 시큐리티가 필요 시 생성.(default)
  • SessionCreationPolicy.Never : 스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용.
  • SessionCreationPolicy.Stateless : 스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않는다. (JWT와 같이 세션을 사용하지 않는 경우 사용)
728x90
반응형