스프링 시큐리티는 단순한 인증과 권한 부여를 넘어, 세션의 생명주기를 관리하고 보안상 발생할 수 있는 다양한 예외 상황에 유연하게 대응할 수 있는 강력한 기능을 제공한다. 이번 글에서는 동시 세션 제어와 세션 트래킹, 그리고 체계적인 예외 처리 설정에 대해 살펴본다.
![]()
1. 동시 세션 제어를 통한 보안 강화
사용자가 인증된 후에도 세션 정보를 유지해야 하는 웹 사이트에서 보안을 한층 더 강화할 수 있는 방법 중 하나가 바로 동시 세션 제어이다. 이는 동일한 계정으로 동시에 가질 수 있는 세션의 수를 제한하여, 무분별한 중복 로그인을 방지하고 계정 도용의 위험을 줄이는 데 기여한다.
-
리스너 설정: 이 기능을 구현하려면 먼저 서블릿 컨테이너에 세션 라이프사이클 이벤트를 스프링 시큐리티에 전달할 수 있도록
HttpSessionEventPublisher를 빈으로 등록해야 한다. -
정책 설정: 설정 파일에서
maximumSessions를 통해 최대 세션 수를 지정한다.maxSessionsPreventsLogin(true)를 설정하면 추가 로그인을 차단하고,false인 경우 기존 세션을 만료시킨다.
2. 세션 레지스트리를 활용한 사용자 모니터링
스프링 시큐리티의 세션 관리 기능은 단순히 제어에 그치지 않고, 현재 시스템을 이용 중인 사용자들의 활동 정보를 추적하는 데에도 활용된다. SessionRegistry는 활성화된 세션과 해당 세션을 소유한 사용자 정보를 관리하는 핵심 컴포넌트이다.
-
사용자 트래킹: 이를 활용하면 관리자 페이지에서 현재 온라인 상태인 사용자의 목록을 보여주거나, 각 사용자가 마지막으로 요청을 보낸 시간을 파악하는 등의 기능을 쉽게 구현할 수 있다.
-
데이터 추출:
getAllPrincipals()메서드를 통해 현재 로그인한 모든 사용자 정보를 가져오고, 각 사용자별 세션 상세 정보(SessionInformation)를 모델 객체에 담아 UI에 표현할 수 있다.
3. 체계적인 예외 처리와 접근 거부 페이지 설정
보안이 적용된 리소스에 권한이 없는 사용자가 접근하거나 인증되지 않은 사용자가 접근할 때 발생하는 예외를 적절히 처리하는 것은 사용자 경험 측면에서 매우 중요하다.
-
ExceptionTranslationFilter: 필터 체인의 후반부에 위치하여 보안 예외를 감지한다.
-
AuthenticationException: 인증되지 않은 사용자가 접근 시 발생하며,
AuthenticationEntryPoint를 통해 로그인 페이지로 유도한다. -
AccessDeniedException: 권한이 부족한 경우 발생하며,
AccessDeniedHandler를 통해 처리한다.
-
-
커스텀 페이지: 기본 403 에러 페이지 대신 서비스 디자인에 맞춘 전용 뷰를 연결하면 사용자에게 문제 원인을 친절하게 설명할 수 있다.
4. 인프라스트럭처 빈의 수동 설정과 유연성
스프링 시큐리티의 네임스페이스 설정을 사용하면 복잡한 내부 구조를 몰라도 빠르게 보안 기능을 적용할 수 있지만, 보다 정밀한 제어가 필요한 경우에는 내부 빈들을 직접 설정하는 방식을 고려해야 한다. 각 컴포넌트 간의 의존 관계를 명확히 이해하고 수동으로 빈을 등록하면, 표준 설정으로는 구현하기 어려운 비즈니스 요구사항을 충족할 수 있는 유연성을 얻게 된다.
결론적으로, 스프링 시큐리티는 세션 관리부터 정교한 예외 처리까지 웹 애플리케이션 보안에 필요한 전반적인 인프라를 제공한다. 이러한 고급 기능들을 적절히 활용한다면 더욱 안전하고 견고한 애플리케이션을 구축할 수 있을 것이다.