Spring Security

[Security] 동시세션제어, 세션고정보호, 세션정책

cornarong 2021. 12. 8. 22:43

1. 동시 세션 제어

: 동일한 계정으로 인증을 받을 떄 생성되는 세션의 개수가 허용 개수를 초과할 경우 어떻게 세션 유지할지 제어하는 것

 

최대 세션 허용 개수 초과 시 -> 시큐리티에서 2가지 전략을 제공합니다.

1. 이전 사용자 세션 만료 

: 새로운 사용자에게 세션 생성, 이전(기존) 사용자의 세션을 만료시킵니다.

2. 현재 사용자 인증 실패

: 이전(기존) 사용자의 세션을 유지시키고, 새로운 사용자의 인증예외를 발생시킵니다.

 

사용 방법)

http.sessionManagement() : 세션 관리 기능이 작동

protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement()
         .maximumSessions(1) // 최대 허용 가능 세션 수, -1 : 무제한 로그인 세션 허용
         .maxSessionsPreventsLogin(true) // 동시 로그인 차단, false : 기존 세션 만료(default)
         .invalidSessionUrl("/invalid") // 세션이 유효하지 않을 대 이동 할 페이지
         .expiredUrl("/expired") // 세션이 만료된 경우 이동 할 페이지

1번 전략 : .maxSessionsPreventsLogin(false) 사용시 기존 사용자 세션 만료 

 

2번 전략 : .maxSessionsPreventsLogin(true) 사용시 새로운 사용자 인증예외 발생

exception : Maximum sessions of 1 for this principal exceeded

2. 세션 고정 보호

세션 고정 공격을 방지하기 위해서 시큐리티는 세션 고정 보호 기능을 제공합니다.

사용자는 공격자가 심어놓은 쿠키로 인증을 하더라도 인증을 할 떄 마다 새로운 세션이 생성됩니다.

 

사용방법)

http.sessionManagement()
        .sessionFixation().changeSessionId(); // 기본 값 (서블릿 3.1 이상의 기본 값)

        // 새로운 세션 할당, 기존 세션의 모든 어트리뷰트가 새로운 세션으로 이동한다. (서블릿 3.1 이하의 기본 값)
        //.sessionFixation().migrateSession()

        // 새로운 세션 생성, 기존 세션의 모든 어트리뷰트는 새로운 세션으로 옮겨지지 않는다.
        //.sessionFixation().newSession() // 새로운 세션 생성

        // 설정해제, 공격에 방치된다.
        //.sessionFixation().none();

3. 세션 정책

사용방법)

http.sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
		//.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
  		//.sessionCreationPolicy(SessionCreationPolicy.NEVER)
		//.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    }

.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) : 스프링 시큐리티가 필요 시 생성(기본 값)
.sessionCreationPolicy(SessionCreationPolicy.ALWAYS) :  스프링 시큐리티가 항상 세션 생성
.sessionCreationPolicy(SessionCreationPolicy.NEVER) : 스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) : 스프링 시큐리티가 생성하지도 않고 존재해도 사용하지 않음