상세 컨텐츠

본문 제목

[SPRING SECURITY] 세션관리를 위한 SessionManagementFilter와 ConcurrentSessionFilter

JAVA/SPRING

by ranlan 2022. 11. 20. 21:20

본문

728x90

SessionManagementFilter

https://docs.spring.io/spring-security/site/docs/4.0.x/apidocs/org/springframework/security/web/session/SessionManagementFilter.html

 

SessionManagementFilter (Spring Security 4.0.4.RELEASE API)

setInvalidSessionStrategy public void setInvalidSessionStrategy(InvalidSessionStrategy invalidSessionStrategy) Sets the strategy which will be invoked instead of allowing the filter chain to prceed, if the user agent requests an invalid session Id. If t

docs.spring.io

세션 관리를 위한 필터로 스프링 시큐리티의 네 가지 기능을 지원한다.

  • 인증 시 세션 정보를 등록하고 조회, 삭제 등 세션 이력을 관리한다.
  • 접속 허용 최대 세션 수 제한을 통한 동시 세션 제어 > ConcurrentSessionFilter에 이어서..
  • 인증 시마다 새로 세션 쿠키를 발급하여 세션 고정 공격으로부터 보호한다.
  • 세션 생성 정책을 조작한다.

 

 

ConcurrentSessionFilter

https://docs.spring.io/spring-security/site/docs/4.0.x/apidocs/org/springframework/security/web/session/ConcurrentSessionFilter.html

 

ConcurrentSessionFilter (Spring Security 4.0.4.RELEASE API)

Filter required by concurrent session handling package. This filter performs two functions. First, it calls SessionRegistry.refreshLastRequest(String) for each request so that registered sessions always have a correct "last update" date/time. Second, it re

docs.spring.io

ConcurrentSessionFilter의 주 역할은 동시 접속에 대한 제어이다.

사용자의 요청이 들어올 때마다 매번 세션이 만료되었는지 체크하고 만료된 세션의 경우 해당 요청자를 로그아웃 시킨다. 실질적인(물리적인) 세션의 만료가 이뤄지는 필터이다.

자세한 동작 방식은 코드를 통해 알 수 있다.

private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpSession session = request.getSession(false);
    if (session != null) {
        SessionInformation info = this.sessionRegistry.getSessionInformation(session.getId());
        if (info != null) {
            if (info.isExpired()) {
                // Expired - abort processing
                this.logger.debug(LogMessage
                        .of(() -> "Requested session ID " + request.getRequestedSessionId() + " has expired."));
                doLogout(request, response);
                this.sessionInformationExpiredStrategy
                        .onExpiredSessionDetected(new SessionInformationExpiredEvent(info, request, response));
                return;
            }
            // Non-expired - update last request date/time
            this.sessionRegistry.refreshLastRequest(info.getSessionId());
        }
    }
    chain.doFilter(request, response);
}

SessionRegistry에서 요청의 아이디로 세션 정보(SessionInformaion)를 읽어온 후 세션이 만료되었는지 확인한다.

만료된 경우 로그아웃(doLogout) 시키고 지정된 만료된 세션 정책(SessionInformatioinExpriedStrategy)에 따라 동작한다.

 

 

SessionManagementFilter와 ConcurrentSessionFilter 동작 방식

  1. 사용자가 인증 요청을 한다.
  2. SessionManagementFilter에서 동시 접속 가능한 최대 세션 수를 확인한다.
  3. 허용 가능한 최대 세션 수를 초과하였을 때 로그아웃 되어야하는 사용자에 대해(이는 설정하기 나름) 세션을 만료처리한다.
    이때 물리적인 세션 만료가 아닌 SessionInformation의 expired 변수가 true가 된다.
  4. 이전 사용자가(혹은 만료된 사용자가) 요청하면 ConcurrentSessionFilter에서 세션 만료를 검사한다.
    이때 SessionManagementFilter에서 expiredNow() 했는지 isExpired() 메서드를 통해 확인하고 물리적으로 세션을 만료시킨다.

 

전체적인 흐름은 아래와 같다.

 

 

 


[세션관리 ( 동시접속 )] https://escapefromcoding.tistory.com/487

[Spring Security : SessionManagementFilter / ConcurrentSessionFilter] https://ojt90902.tistory.com/828

 

728x90

관련글 더보기

댓글 영역