본문 바로가기
Spring Security

동시 세션 제어 / 세션 고정 보호 / 세션 정책

by asdft 2024. 2. 6.

동시 세션 제어

현재 동일한 계정으로 인증을 받을 때, 생성되는 세션의 허용 개수가 초과되었을 경우에 어떻게 그 세션을 계속적으로 초과하지 않고 유지할 수 있을까?

 

Spring Security의 동시 세션 제어 전략에는 2가지(이전 사용자 세션 만료 / 현재 사용자 인증 실패) 방식이 있다.

 

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

 

만약 invalid 하면서 expired된 세션일 경우, invalidSession이 우선시 되어,

invalidSessionUrl에서 설정한 페이지로 이동한다.


세션 고정 보호

세션 고정 공격

 

 

http.sessionManagement( ) : 세션 관리 기능이 작동함
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionFixation().changeSessionId()  	//기본값
 					//none, migrateSession, newSession
}

none : 세션이 새로 생성되지도 않고, 세션ID도 변하지 않음. 세션 고정 공격에 취약.

migrateSession : 새로운 세션이 생성되고, 세션 ID도 새로 발급 (세션 고정 보호 가능). 이전 세션의 여러 속성값들 그대로                              사용 가능.

newSession : 새로운 세션이 생성되고, 세션 ID도 새로 발급 (세션 고정 보호 가능). 이전 세션의 여러 속성값들 사용 불가.

                        -> changeSessionId( ) 와 동일.

 


세션 정책

http.sessionManagement( ) : 세션 관리 기능이 작동함
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
	.sessionCreationPolicy(SessionCreationPolicy. If_Required)
}

 

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

 

ex) Jwt의 경우 세션을 사용하지 않고 토큰에 모든 사용자의 정보나 추가 사항들을 토큰에 저장하고 인증을 받는 방식이라 SessionCreationPolicy.Stateless로 설정해야 함.