동시 세션 제어
현재 동일한 계정으로 인증을 받을 때, 생성되는 세션의 허용 개수가 초과되었을 경우에 어떻게 그 세션을 계속적으로 초과하지 않고 유지할 수 있을까?
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로 설정해야 함.
'Spring Security' 카테고리의 다른 글
JWT 로그인 시 Refresh-Token 저장소를 Redis로 변경하는 이유 (0) | 2024.05.20 |
---|---|
JWT와 Redis를 활용한 인증 시스템 구축하기(1) (0) | 2024.05.19 |
기본 API & Filter 이해 (3) - Logout, LogoutFilter (0) | 2024.02.02 |
기본 API & Filter 이해 (2) - UsernamePasswordAuthenticationFilter (0) | 2024.02.02 |
기본 API & Filter 이해 (1) (0) | 2024.02.02 |