본문 바로가기

Spring security

스프링 시큐리티 기본 API 및 Filter 이해 - 동시 세션 제어, 세션 고정 보호, 세션 정책

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

동시 세션 제어

동시 세션 제어는 서버에서 한명의 사용자가 가질수 있는 세션의 개수를 제어하는 것을 말한다. 즉 서로 다른 브라우저 다른 pc에서 동일한 사용자로 접속하지 못하게 막는것이다.

그리고 스프링 시큐리티에서는 위와 같이 최대 세션 개수 초과시 아래와 같이 세션의 동시성을 제어한다.

  1. 이전 사용자 세션를 만료 시키거나
  2. 현재 사용자 인증 실패

이때 invalidSessionUrl과 expiredUrl이 둘다 설정 되어 있을경우 invalidSessionUrl의 경로가 우선시 된다.

세션 고정 공격/보호

세션 고정 공격의 흐름

고정 세션 공격이 이루어지는 흐름을 설명하면 다음과 같다.

  1. 공격자가 WebApp에 접근하여 JSESSIONID를 발급받는다.
    1. 이때 발급은 was에 의해 이루어지며 인증 여부와 상관없이 이루어진다.
    2. was에 의해 발급되는 세션의 이름의 기본값은 JSESSIONID이다.
  2. 공격자가 사용자에게 자신의 세션 값을 심어둔다.
  3. 사용자가 WebApp에 공격자의 SessionID를 가지고 인증을 시도하고 성공시 WebApp은 사용자가 가지고 있던 세션값을 기반으로 인증정보를 생성하여 저장한다.
  4. 공격자는 사용자인척 WebApp에 접속이 가능하다.

이때 스프링 시큐리티를 사용하면 인증을 할때마다 세션을 새로 발급하여 세션 고정 공격을 막아준다.

세션 정책

스프링 시큐리티가 제공하는 세션 관리 정책은 다음과 같다.

코드

//동시 세션 제어
http
    .sessionManagement(sessionManagement -> sessionManagement
        .maximumSessions(1)                       // (1) 동일한 사용자에 대해 동시에 존재할 수 있는 최대 세션 수 지정
        .maxSessionsPreventsLogin(true)           // (2) 최대 세션에 도달했을 때 추가 로그인 시도를 차단할 지 설정
    );

//세션 고정 공격 보호
http
    .sessionManagement(sessionManagement -> sessionManagement
        .sessionFixation().changeSessionId()      // (1) 세션 고정 공격 방지 전략 설정
																									// (2) none, migrateSession, newSession을 사용할 수 있다.
    );