-
[스프링 시큐리티] 동시 세션 제어강의노트/스프링 시큐리티 2020. 9. 10. 19:05
최대 세션 허용 개수 초과 (동일한 계정으로 생성되는 세션 개수) 시 제어 방법
- 이전 사용자의 세션 만료 (maxSessionsPreventsLogin : false)
- 신규 사용자의 인증 실패 (maxSessionsPreventsLogin : true)
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .maximumSessions(1) // 최대 허용 가능 세션 수, -1인 경우 무제한 세션 허용 .maxSessionsPreventsLogin(true) // 동시 로그인 차단, false인 경우 기존 세션 만료(default) .invalidSessionUrl("/invalid") // 세션이 유효하지 않을 경우 이동 할 페이지 .expiredUrl("expired") // 세션이 만료된 경우 이동 할 페이지 }
동시성 이슈
maximumSessions의 개수를 2개로 하고 서로 다른 3개의 브라우저를 띄운 후 2개의 브라우저에서 로그인 후 로그아웃을 한다음에 마지막 하나의 브라우저에서 로그인 시 허용 가능 세션 수를 초과했다는 exception이 발생한다.
로그아웃을 했기 때문에 세션의 개수가 0이라 생각했는데 로그인이 안되었다.
이에 대한 해결책으로 SessionRegistry 빈을 생성 후 sessionManagement에 DI 시킨다.
protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .maximumSessions(2) // 최대 허용 가능 세션 수, -1인 경우 무제한 세션 허용 .maxSessionsPreventsLogin(true) // 동시 로그인 차단, false인 경우 기존 세션 만료(default) .sessionRegistry(sessionRegistry()); } @Bean public SessionRegistry sessionRegistry() { return new SessionRegistryImpl(); } @Bean public static ServletListenerRegistrationBean httpSessionEventPublisher() { return new ServletListenerRegistrationBean(new HttpSessionEventPublisher()); }
'강의노트 > 스프링 시큐리티' 카테고리의 다른 글
[스프링 시큐리티] 세션 생성 정책 (0) 2020.09.10 [스프링 시큐리티] 세션 고정 보호 (0) 2020.09.10 [스프링 시큐리티] AnonymousAuthenticationFilter (0) 2020.09.10 [스프링 시큐리티] RememberMeAuthenticationFilter (0) 2020.09.10 [스프링 시큐리티] LogoutFilter (0) 2020.09.10