[ODOP] 76 일차 - 동시 세션 제어, 세션 고정 보호, 세션 정책
💡
최신 버전에서는 아래의 방식과는 조금 다르게 권한설정을 진행한다.
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다
동시 세션 제어 전략
💡
상황 가정
하나의 계정으로 여러 개의 세션에 접근하고자 하는 사용자가 있다
개발자는 한 계정당 세션 허용 갯수를 1개로 지정 해 놓았다
사용자는 새로운 세션에 접근하고자 하고 이 때 사용할 수 있는 전략이다
하나의 계정으로 여러 개의 세션에 접근하고자 하는 사용자가 있다
개발자는 한 계정당 세션 허용 갯수를 1개로 지정 해 놓았다
사용자는 새로운 세션에 접근하고자 하고 이 때 사용할 수 있는 전략이다
동시 세션 제어 설정
private void sessionConfigure(HttpSecurity http) throws Exception {
http.sessionManagement() // 세션 관리 기능 작동
.maximumSessions(1) // 최대 허용 가능 세션 수, -1 : 무제한 로그인 세션 허용
.maxSessionsPreventsLogin(true) // 동시 로그인 차단함, false : 기존 세션 만료(default)
.expiredUrl("/expired") // 세션이 제한 갯수를 초과할 때 리디렉션 할 URL
;
}
세션 고정 보호
세션 고정 공격
- 하나의 JSESSIONID 로 공격자와 사용자가 세션을 공유하는 것
이를 보호하기 위해 세션 고정 보호 기능을 제공한다
세션 고정 보호 설정
private void immovableSessionConfigure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionFixation().changeSessionId() // 기본값 option:[none, migrateSession, newSession]
;
}
changeSessionId() [Default]
- 서블릿 컨테이너에서 제공하는 세션 고정 보호를 사용하도록 지정
- 세션이 인증되면 세션 ID 를 변경하고 모든 세션 속성을 유지하기 위해 서블릿 메서드
HttpServletRequest#ChangeSessionId()
가 호출
newSession()
- 새로운 세션을 작성
- 기존의 세션은 유지하지 않는다.
migrateSession()
- 새로운 세션을 생성
- 기존의 세션은 유지
none()
- 세션 고정 보호를 비활성화
- 세션 고정 보호를 위한 다른 메커니즘을 사용할 때 유용함
- 예를들어 애플리케이션 컨테이너 세션 고정 보호가 이미 사용중인 경우
세션 정책
세션 정책을 적용하는 방법은 다음과 같습니다
private void sessionPolicyConfigure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 기본값
;
}
SessionCreationPolicy.Always
스프링 시큐리티가 항상 세션을 생성합니다
SessionCreationPolicy.If_Required
스프링 시큐리티가 필요 시 생성(기본값)
SessionCreationPolicy.Never
스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용
SessionCreationPolicy.Stateless
스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않음
JWT 같이 세션을 사용하지 않는 인증 방식을 사용할 때 설정하는 기능