- SessionManagementFilter
- ConcurrentSessionFilter
1. SessionManagementFilter
- 스프링 시큐리티 6이상에서는 sessionManagement()를 설정하는 경우에만 SessionManagementFilter가 생성된다
HttpSecurity.sessionManagement(session -> session
.invalidSessionUrl("/invalidSessionUrl")
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
.expiredUrl("/expiredUrl")
)
2. ConcurrentSessionFilter
- 동시 세션 제어와 밀접한 관계
- 세션의 정보들을 최신 상태로 만든다
- 세션 만료 설정 단계에서는 세션이 만료 되는 것이 아니다. 설정만 하는 것
다시 재접속을 했을 때 ConcurrentSessionFilter가 받아서 세션 만료를 확인한 뒤 만료를 확인한다음 만료를 시킨다.
3. SessionRegistry
- 세션의 정보를 관리하는 클래스로 다양한 인터페이스가 구현되어 있어서 해당 클래스로 필요한 로직을 구현하여 모니터링 할 수 있다.
- 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());
}
}
}
}