인프런 정수원님의 “스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security"를 보고 작성한 글입니다.
동시 세션 제어

동시 세션 제어는 서버에서 한명의 사용자가 가질수 있는 세션의 개수를 제어하는 것을 말한다. 즉 서로 다른 브라우저 다른 pc에서 동일한 사용자로 접속하지 못하게 막는것이다.
그리고 스프링 시큐리티에서는 위와 같이 최대 세션 개수 초과시 아래와 같이 세션의 동시성을 제어한다.
- 이전 사용자 세션를 만료 시키거나
- 현재 사용자 인증 실패

이때 invalidSessionUrl과 expiredUrl이 둘다 설정 되어 있을경우 invalidSessionUrl의 경로가 우선시 된다.
세션 고정 공격/보호

고정 세션 공격이 이루어지는 흐름을 설명하면 다음과 같다.
- 공격자가 WebApp에 접근하여 JSESSIONID를 발급받는다.
- 이때 발급은 was에 의해 이루어지며 인증 여부와 상관없이 이루어진다.
- was에 의해 발급되는 세션의 이름의 기본값은 JSESSIONID이다.
- 공격자가 사용자에게 자신의 세션 값을 심어둔다.
- 사용자가 WebApp에 공격자의 SessionID를 가지고 인증을 시도하고 성공시 WebApp은 사용자가 가지고 있던 세션값을 기반으로 인증정보를 생성하여 저장한다.
- 공격자는 사용자인척 WebApp에 접속이 가능하다.
이때 스프링 시큐리티를 사용하면 인증을 할때마다 세션을 새로 발급하여 세션 고정 공격을 막아준다.
세션 정책

스프링 시큐리티가 제공하는 세션 관리 정책은 다음과 같다.
코드
//동시 세션 제어
http
.sessionManagement(sessionManagement -> sessionManagement
.maximumSessions(1) // (1) 동일한 사용자에 대해 동시에 존재할 수 있는 최대 세션 수 지정
.maxSessionsPreventsLogin(true) // (2) 최대 세션에 도달했을 때 추가 로그인 시도를 차단할 지 설정
);
//세션 고정 공격 보호
http
.sessionManagement(sessionManagement -> sessionManagement
.sessionFixation().changeSessionId() // (1) 세션 고정 공격 방지 전략 설정
// (2) none, migrateSession, newSession을 사용할 수 있다.
);