SPRING/스프링 시큐리티
세션 정책 및 고정세션 공격방지
JUMP개발자
2021. 8. 3. 10:51
스프링 시큐리티에서는 세션 관련 정책을 설정할 수 있다.
하나의 계정에 최대 몇개의 세션을 유지할 것인지, 새로운 사용자가 접근하면 로그인을 금지할 것인지 아니면 기존 사용자를 로그아웃 시킬 것인 지 등 정책 설정이 필요하다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
// 모든 리소스에 대한 인증완료시 접근 허용
http
.authorizeRequests()
.anyRequest().authenticated();
// form Login 사용
http
.formLogin();
// 세션 정책 (최대 세션 개수 1개로 설정 및 해당 횟수 넘으면 로그인 X)
http
.sessionManagement()
.maximumSessions(1) // 최대 세션 개수 1
.maxSessionsPreventsLogin(true); // 최대 세션 개수를 초과할 시에 로그인 방지
}
}
위 설정에서 동일 계정으로 2번 로그인 시 아래와 같은 화면이 나온다.
.maxSessionsPreventsLogin(false); 로 설정시에는 기존 사용자가 세션아웃이 된다.
고정세션공격 보호하기
공격자가 JESSIONID를 가로채서 Session을 공유하여 공격
-> 사용자에게 접속할때마다 JESSIONID를 발급해서 막음.
아무 설정을 하지 않으면 default 값인 changeSessionId로 설정
1. changeSessionId()
- 새로운 세션ID가 발급됨.
- 이전 세션 사용이 가능함.
http
.sessionManagement()
.sessionFixation()
.changeSessionId()
.maximumSessions(1);
2. newSession()
- 새로운 세션ID가 발급됨.
- 이전 세션 사용이 불가능함.
http
.sessionManagement()
.sessionFixation()
.newSession();
3. none()
- 아무설정을 하지 않음. (고정세션 공격이 됨)
http
.sessionManagement()
.sessionFixation().none();