동시 세션 제어

최대 허용 세션이 초과했을 경우 시큐리티는 2개의 설정이 있다.
sessionManagement > maxSessionsPreventsLogin() 를 사용하여 기본값은 false로 기존 세션을 만료시키고 true는 현재 접속하는 세션을 차단한다.

http.sessionManagement()
    .maximumSessions(1)  // 최대 허용 가능 세션 수,  -1 : 무제한
    .maxSessionsPreventsLogin(false)  // 동시 로그인 차단함,  false : 기존 세션  만료 (default)
    .expiredUrl("/expired")  // 세션이 만료된 경우 이동할 페이지

 

테스트

maxSessionsPreventsLogin를 true로 설정해서 초과하는 세션을 차단할 경우
아래와 같이 문구가 표시되는 걸 확인 할 수 있다.

 

반대로 false로 설정해서 기존 세션을 만료시키도록 설정하고 expirdUrl를 주석처리한다면 |
아래와 같이 표시되는걸 확인 할 수 있다.

 

 

 


 

세션 고정 보호

 

만약 세션이 자원에 접근할 때마다 바뀐지 않고 동일하다면 위 이미지와 같이 일이 일어나게 된다. 스프링 시큐리티는 세션 고정을 보호하기위해 아래와같은 설정이 존재한다.

설정 종류

migrateSession, changeSessionId : 세션아이디는 변경하고, 세션의 내용을 그대로 유지하는 방식 (default)
newSession : 새 세션이 만들어지고 기존 데이터는 보존되어지지 않는다.
none : 세션 고정공격 방어하지 않는다.

시큐리티는 기본적으로 세션 고정 보호를 하기위해 따로 설정해주지 않아도 Servlets 3.0 또는 그 이전 버전의 경우 "migrateSession" 값이 기본으로 설정됩니다. Servlets 3.1 이상이면 "changeSessionId" 값이 설정된다.

 

설정 방법

http.sessionManagement()
    .sessionFixation().changeSessionId()  //  설정안해도 기본값  //none, 3.0 migrateSession, newSession

 


 

세션정책

  • SessionCreationPolicy. Always   :  스프링 시큐리티가 항상 세션 생성
  • SessionCreationPolicy. If_Required   :  스프링 시큐리티가 필요 시 생성(기본값)
  • SessionCreationPolicy. Never     :  스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용
  • SessionCreationPolicy. Stateless    :  스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않음 

Stateless는 보통 JWT를 사용할  때 설정한다.

설정방법은 아래와 같다.

		http.sessionManagement()
			.sessionCreationPolicy(SessionCreationPolicy.ALWAYS);

 

 

복사했습니다!