서버는 기본적으로 사용자를 보면서 판단할 수 없다. 서버는 로그인을 통해 요청을 보낸 사용자를 구별한다. 하지만 모든 요청에 아이디/패스워드를 물어볼 수는 없다. 그래서 토큰을 발급하고, 세션에는 토큰을 저장해 놓고 세션이 유지되는 동안, 혹은 remember-me 토큰이 있다면 해당 토큰이 살아있는 동안 로그인 없이 해당 토큰만으로 사용자를 인증하고 요청을 처리해준다.
그래서 악의적으로 정보를 취하고자 하는 사람들(해커)은 세션을 탈취하기 위한 시도를 한다. 따라서 세션 관리에 헛점이 없어야 한다.
만료된 세션에 대한 요청인 경우 세션 즉시 종료. 세션 만료에 대한 판단은 SessionManagementFilter의 ConcurrentSessionControlAuthenticationStrategy에서 처리한다.
문제점
SessionAuthenticationStrategy에서 여러가지 세션 인증 정책을 관리하도록 설정할 수 있다.
http
.sessionManagement(session->session
.sessionFixation(fix->fix.changeSessionId())
.maximumSessions(1)
.key("remember-me")
.tokenValiditySeconds(30*24*60*60)
.maxSessionsPreventsLogin(false)
.expiredUrl("/session-expired")
)
브라우저로 서버에 접속한다.
정상 사용자의 브라우저에 내 브라우저의 세션값을 주입한다.
정상 사용자가 해당 사이트에 로그인 하기만 하면 내 브라우저로 마치 인증된 사용자인 것처럼 리소스에 접근할 수 있다.
ConcurrentSessionControlAuthenticationStrategy : 동시 세션의 개수 제한. RegistrySessionAuthenticationStrategy와 함께 SessionRegistry를 참조해 작업한다.
세션 정책
참고