스프링 시큐리티 - 세션 제어 기능

SeungTaek·2022년 2월 12일
post-thumbnail

본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!

아래에서 알아볼 내용은 3가지이다.
1. 동시 세션 제어
2. 세션 고정 보호
3. 스프링 시큐리티 세션 정책 설정


1. 동시 세션 제어

동일한 계정으로 로그인 되면 어떤 일이 벌어질까?
스프링 시큐리티에서 로그인 정보에 대한 인증이 끝나면 세션에 인증 객체를 만들어 저장한다. 이때 동일한 계정으로 로그인 했다면 똑같은 회원에 대해 서로 다른 세션이 여러개 만들어질 것이다.
스프링 시큐리티 설정을 통해 이를 제어할 수 있다. 최대 세션 허용 개수를 설정할 수 있고, 허용 개수를 넘어갔을 경우의 정책도 설정할 수 있다.

만약 최대 세션 허용 개수를 초과했다 가정하자. 두 가지 방법이 있다.

  1. 이전 사용자의 세션을 만료시킨다.

  2. 현재 로그인 사용자의 인증을 실패한다.

사용할 정책을 사용자가 결정할 수 있다. 기본값은 1번 처럼 기존 세션을 만료시키는 방법이다.


설정 코드를 보자.

http.sessionManagement()
  .maximumSessions(1)
  .maxSessionsPreventsLogin(true)
  1. .sessionManagement(): 세션 관리 기능을 작동시킨다.
  2. .maximumSessions( 숫자 ): 최대 허용 가능 세션 수를 정할 수 있다. 만약 -1을 넣는다면 무제한 로그인 세션을 허용한다는 의미이다.
  3. .maxSessionsPreventsLogin: 최대 허용 가능 세션 수를 넘어갈 경우의 정책을 설정할 수 있다. 기본값은 false(기존 세션 만료)이고, true값을 넣게 되면 요청 사용자의 인증이 실패한다.


2. 세션 고정 보호

해커가 자신의 JSESSIONID을 어떤 사용자의 브라우저의 쿠키에 넣는다고 하자. 사용자는 아무것도 모르고 자신의 계정을 이용해 로그인한다. 서버에서는 넘어온 JSESSIONID을 이용해서 인증 객체를 만들어 세션에 저장한다.
이제 해커는 해당 사용자의 리소스를 이용할 수 있다. 왜냐하면 해커가 가지고 있는 토큰은 서버에서 인증된 토큰이기 때문이다.

이런 보안 사고를 예방하기 위해 인증에 성공할 때마다 세션을 다시 만들고, 쿠키도 새롭게 다시 발급해준다. 이를 세션 고정 보호라고 한다.

스프링 시큐리티는 세션 고정 보호를 기본적으로 제공해준다. 물론 사용자가 커스텀하게 설정할 수도 있다.

http
  .sessionManagement()
  .sessionFixation().none();

sessionFixation().정책(): 설정할 수 있는 정책은 다음과 같다.

  • .none(): 세션을 재생성하지 않는다. 즉, 세션 고정 보호를 사용하지 않는다.
  • .changeSessionId(): 인증 때마다 세션 아이디를 변경한다. 서블릿 3.1 이상부터 기본값으로 제공된다.
  • .migrateSession(): 위와 마찬가지로 인증 때마다 세션 아이디를 변경한다. 단, 서블릿 3.1 미만을 지원한다.


3. 세션 정책

일반적으로 세션은 WAS가 먼저 생성을 한다. 스프링 시큐리티는 이미 만들어진 세션이 있으면 그대로 사용하고, 없으면 정책에 따라 세션을 생성할 수도 있다. 여기서 주의해야할 점은 세션이 존재한다고 해서 인증을 받았다는 이야기는 아니다. 세션과 인증은 관계가 없다.

여기서 말할 세션 정책이랑 스프링 시큐리티의 세션 정책이다. WAS의 세션 정책이 아니다.

http
  .sessionManagement()
  .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);

.sessionCreationPolicy( 정책 ): 정책으로는 아래와 같이 설정이 가능하다.

  • SessionCreationPolicy.Always : 스프링 시큐리티가 항상 세션 생성
  • SessionCreationPolicy.If_Required : 스프링 시큐리티가 필요 시 생성(기본값)
  • SessionCreationPolicy.Never : 스프링 시큐리티가 생성하지 않지만 이미 존재하면 사용
  • SessionCreationPolicy.Stateless : 스프링 시큐리티가 생성하지 않고 존재해도 사용하지 않음(JWT을 사용할 때 사용)


Reference

인프런 '스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security' (정수원)

profile
I Think So!

0개의 댓글