오답노트
[Spring Security] SessionManagementFilter 본문
세션 관리
서버는 모든 요청에 아이디/패스워드를 요구 할 수 없다. 그래서 한 번 로그인 하면 토큰을 발급하고, 세션에는 토큰을 저장해 세션이 유지되는 동안, 혹은 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")
)
;
}
}
'Java > Spring' 카테고리의 다른 글
[SpringBoot] @Controller 와 @RestController (0) | 2024.05.06 |
---|---|
[Spring Security] OAuth2 로그인 (0) | 2023.07.28 |
[Spring JPA] 영속성 전이(Cascade) 와 고아제거속성(orphanRemoval) (0) | 2023.07.24 |
[Spring JPA] Entity Relations (0) | 2023.07.19 |
[Spring JPA] Query Method (0) | 2023.07.19 |