사용자가 로그인을 진행한 뒤 사용자 정보는
SecurityContextHolder
에 의해서 서버 세션에 관리된다.이때 세션에 관해 세션의 소멸 시간, 아이디당 세션 생성 개수를 설정하는 방법에 대해서 알아보자.
세션 타임아웃 설정을 통해 로그인 이후 세션이 유지되고 소멸하는 시간을 설정할 수 있다. 세션 소멸 시점은 서버에 마지막 특정 요청을 수행한 뒤 설정한 시간 만큼 유지된다. (기본 시간 1800초)
*application.properties*
//초 기반
server.servlet.session.timeout=1800
//분 기반
server.servlet.session.timeout=90m
*SecurityConfig*
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http
.sessionManagement((auth) -> auth
.maximumSessions(1)
.maxSessionsPreventsLogin(true));
return http.build();
}
sessionManagement()
메소드를 통한 설정을 진행
maximumSession(정수)
: 하나의 아이디에 대한 다중 로그인 허용 개수
maxSessionPreventsLogin(불린)
: 다중 로그인 개수를 초과하였을 경우 처리 방법
true
: 초과시 새로운 로그인 차단false
: 초과시 기존 세션 하나 삭제해커가
ADMIN
계정과 같은 세션ID
를 탈취해서ADMIN
계정을 대행해서 서버의 특정한 권한을 남용 할 수도 있기 때문에 이를 방지해줘야 한다. 먼저 해커가Server
에 접속을 하고 세션 쿠키를 획득해서세션 쿠키 ID
를 가지고 있다가 그ID
를 유저에게 부여한다. 그 후 다시 그 쿠키ID
에 대해서 세션을 받아와서 User가 가진 권한을 얻게 된다. 이ID
를 가지고Server
에 접속하게되면 권한을 남용하며 서비스에 치명적인 문제를 야기할 수 있다.
sessionManagement()
메소드의 sessionFixation()
메소드를 통해서 설정할 수 있다.
sessionManagement().sessionFixation().none()
: 로그인 시 세션 정보 변경 안함sessionManagement().sessionFixation().newSession()
: 로그인 시 세션 새로 생성sessionManagement().sessionFixation().changeSessionId()
: 로그인시 동일한세션에 대한 id
변경@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http
.sessionManagement((session) - session
.sessionFixation((sessionFixation) -> sessionFixation
.newSession()
)
);
return http.build();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http
.sessionManagement((auth) -> auth
.sessionFixation().changeSessionId());
return http.build();
}