[스프링 시큐리티] SessionManagementFilter

may_yun·2024년 10월 30일
0
  1. SessionManagementFilter
  2. ConcurrentSessionFilter

1. SessionManagementFilter

  • 스프링 시큐리티 6이상에서는 sessionManagement()를 설정하는 경우에만 SessionManagementFilter가 생성된다
HttpSecurity.sessionManagement(session -> session
                    .invalidSessionUrl("/invalidSessionUrl")
                    .maximumSessions(1)
                    .maxSessionsPreventsLogin(true)
                    .expiredUrl("/expiredUrl")
            )

2. ConcurrentSessionFilter

  • 동시 세션 제어와 밀접한 관계
  • 세션의 정보들을 최신 상태로 만든다

  1. 세션 만료 설정 단계에서는 세션이 만료 되는 것이 아니다. 설정만 하는 것
    다시 재접속을 했을 때 ConcurrentSessionFilter가 받아서 세션 만료를 확인한 뒤 만료를 확인한다음 만료를 시킨다.

3. SessionRegistry

  • 세션의 정보를 관리하는 클래스로 다양한 인터페이스가 구현되어 있어서 해당 클래스로 필요한 로직을 구현하여 모니터링 할 수 있다.
  1. bean으로 만들어서 사용할 수 있다.
@Bean
    public SessionRegistry sessionRegistry() {
        return new SessionRegistryImpl();
    }
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SessionInfoService {
    private SessionRegistry sessionRegistry;

    public SessionInfoService(SessionRegistry sessionRegistry) {
        this.sessionRegistry = sessionRegistry;
    }

    public void sessionInfo() {
        for (Object principal : sessionRegistry.getAllPrincipals()) {
            //해당 사용자의 접속 세션 전체 조회 (만료된 세션 불포함)
            List<SessionInformation> allSessions = sessionRegistry.getAllSessions(principal, false);
            for (SessionInformation sessionInformation : allSessions) {
                System.out.printf("사용자: %s세션ID: %s최종 요청 시간: %s%n",
                        principal,
                        sessionInformation.getSessionId(),
                        sessionInformation.getLastRequest());
            }
        }
    }

}
profile
개발 일지
post-custom-banner

0개의 댓글