본문 바로가기

Language/Spring Security

동시 세션 제어 - sessionManagement().maximumSessions()

개요

  • 동시 세션 제어는 사용자가 동시에 여러 세션을 생성하는 것을 관리하는 전략
    • 하나의 계정을 가지고 3명의 사용자가 서버에 인증을 받게 되면 3개의 세션이 생김 → 동시적 세션
  • 이 전략은 사용자의 인증 후에 활성화된 세션의 수가 설정된 maximumSessions 값과 비교하여 제어 여부를 결정

 

동시 세션 제어 2가지 유형

  • 사용자 세션 강제 만료
    • 새로운 클라이언트가 접속 시 최대 허용 개수를 초과되었다면 가장 오래된 클라이언트의 세션을 강제로 만료
  • 사용자 인증 시도 차단
    • 최대 허용 개수 초과 시 인증 예외가 발생하여 로그인 자체를 실패
  • 사용자 세션 강제 만료 ⇒ 세션 개수 초과 시 가장 오래된 사용자의 세션을 만료
  • 사용자 인증 시도 차단 ⇒ 세션 개수 초과 시 로그인 불가(인증 시도 차단)

sessionManagement() API - 동시 세션 제어

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

    http.sessionManagement(session -> session
                    .invalidSessionUrl("/invalidSessionUrl")
                    .maximumSessions(1)
                    .maxSessionsPreventsLogin(true)
                    .expiredUrl("/expired")
            );

    return http.build();
}

 

메서드 설명
invalidSessionUrl(경로) 이미 만료된 세션으로 요청을 하는 사용자를 특정 엔드 포인트로 리다이렉션 할 URL 지정
→ 동시 세션 제어 2가지 유형에서 사용자 세션 강제 만료의 경우
maximumSession(n) 사용자당 최대 세션 수를 제어
기본값은 무제한 세션을 허용
maxSessionsPreventsLogin(boolean) ture : 최대 세션 수에 도달했을 때 사용자의 인증을 방지
→ 사용자 인증 시도 차단

false(기본값) : 인증하는 사용자에게 접근을 허용하고 기존 사용자의 세션은 만료
→ 사용자 세션 강제 만료
expiredUrl(경로) 세션을 만료하고 나서 리다이렉션 할 URL 지정

세션 만료 후 리다이렉션 전략

  • 우선순위 ⇒ invalidSessionUrl > expiredUrl

  • 동시 세션 제어를 위해서는 maximumSessions() API 사용 필수
    • 최대 세션 수가 무한대라면 세션 제어를 하는 것이 말이 안 됨