오답노트

[Spring Security] SessionManagementFilter 본문

Java/Spring

[Spring Security] SessionManagementFilter

권멋져 2023. 7. 27. 10:09

세션 관리

서버는 모든 요청에 아이디/패스워드를 요구 할 수 없다. 그래서 한 번 로그인 하면 토큰을 발급하고, 세션에는 토큰을 저장해 세션이 유지되는 동안, 혹은 remember-me 토큰이 있다면 해당 토큰이 살아있는 동안 해당 토큰만으로 사용자를 인증하고 요청을 처리한다.

 

SessionManagementFilter

SessionRegistry를 Bean으로 등록하여 SessionInformation(세션 사용자)를 모니터링 할 수 있다.

 

만료된 세션에 대한 요청은 세션 즉시 종료하고, 만료 판단은 SessionManagementFilter 의 ConcurrentSessionControlAuthenticationStrategy 에서 처리한다.

 

    @Bean
    SessionRegistry sessionRegistry() {
        SessionRegistryImpl registry = new SessionRegistryImpl();
        return registry;
    }

SessionRegistry를 Bean으로 등록

 

SessionRegistry를 통해 세션이 어떻게 관리되는지 알 수 있다.

 

@Controller
public class SessionController {

    @Autowired
    private SessionRegistry sessionRegistry;

    @GetMapping("/sessions")
        public String session(Model model){
            model.addAttribute("sessionList",
                    sessionRegistry.getAllPrincipals().stream().map(p->UserSession.builder()
                            .username(((SpUser)p).getUsername())
                            .sessions(sessionRegistry.getAllSessions(p, false).stream().map(s->
                                    SessionInfo.builder()
                                            .sessionId(s.getSessionId())
                                            .time(s.getLastRequest())
                                            .build())
                                    .collect(Collectors.toList()))
                            .build()).collect(Collectors.toList()));
            return "sessionList";
        }
}

SessionRegistry의 사용 예

 

SessionManagementFilter

세션 인증 정책을 관라하도록 설정할 수 있다.

 

@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .sessionManagement(
                        s->s
                                .maximumSessions(1)
                                .maxSessionsPreventsLogin(false)
                                .expiredUrl("/session-epired")
                )
                ;
    }
}