Published 2023. 4. 15. 11:29
동시 세션 제어
최대 허용 세션이 초과했을 경우 시큐리티는 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);