동시 세션 제어 / 세션 고정 보호 / 세션 정책
동시 세션 제어
현재 동일한 계정으로 인증을 받을 때, 생성되는 세션의 허용 개수가 초과되었을 경우에 어떻게 그 세션을 계속적으로 초과하지 않고 유지할 수 있을까?
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로 설정해야 함.