쌩로그

익명사용자 인증필터, 동시세션제어, 세션 고정 보호, 세션 정책 본문

Spring/Spring Security

익명사용자 인증필터, 동시세션제어, 세션 고정 보호, 세션 정책

.쌩수. 2023. 5. 12. 13:07
반응형

목차

  1. 해당 포스팅 개요
  2. 본론
       2-1. AnonymousAuthenticationFilter
         2-1-1. 개념
         Filter 흐름
       2-2. 동시 세션 제어
         2-2-1. 개념
         2-2-2. 전략
       2-3. 세션 고정 보호
         2-3-1. 개념 및 설명
       2-4. 세션 정책
  3. 요약
  4. 푸념

1. 해당 포스팅 개요

제목에 나와있듯 4가지 항목을 볼 예정이다.

  1. AnonymousAuthenticationFilter
  2. 동시 세션 제어
  3. 세션 고정 보호
  4. 세션 정책

최대한 간단하게 해보도록 할 것이다.

코드에 대한 정리는 학습용 레포에 있다.

참고로 실험 장면으로 나오는 gif는 서로 다른 브라우저(나는 크롬과 엣지를 같이 사용)를 이용해야 한다.

2. 본론

2-1. AnonymousAuthenticationFilter

2-1-1. 개념

익명사용자와 인증사용자를 구분하기 위한 용도로 사용한다.

2-1-2. 흐름

AnonymousAuthenticationFilter의 차이를 위해 인증을 간략히 정리하면,

  1. 사용자가 인증을 받았으면, 인증된 Authentication세션에 저장된다.
  2. 서버가 세션으로부터 Authentication 존재여부를 확인한다.
  3. 존재 여부가
         // null이 아니라면, 사용자가 접근하려는 자원을 허용하지만,
         // null이라면, 인증되지 않은 사용자로 인식하여 예외를 발생시킨다.

AnonymousAuthenticationFilter 흐름도 위와 유사하지만,
차이점은 null일 때 어떻게 처리를 하냐는 것이다.

null이 아니라면 즉, Authentication이 존재하면 다음 필터로 넘어가지만,
null이라면 즉, Authentication이 존재하지 않으면 AnonymousAuthenticationToken을 생성해서 SecurityContext에 담는다.

참고로 이 인증객체는 세션에 저장하지 않는다
참고로 AnonymousAuthentication은 익명객체를 의미한다.

화면에서 인증 여부를 구현할 때 isAnonymous()isAuthenticated()로 구분해서 사용한다.
isAnounymous()는 로그인을 할 때,
isAuthenticated()는 로그아웃시에 사용한다.

2-2. 동시 세션 제어

2-2-1. 개념

동일한 계정으로 인증할 때 생성되는 세션의 개수가 허용되는 세션 개수를 초과하지 않도록 유지하기 위한 제어를 말한다.

2-2-2. 전략

두 가지 전략이 있다. 이전 사용자 세션 만료현재 사용자 인증 실패
각 전략의 예시는 최대 세션 허용 개수가 1개라고 설정하고 예를 든다.

  1. 이전 사용자 세션 만료
  • 새로 로그인 할 때마다 세션을 갱신한다.
  • 대강 흐름은 다음과 같다.
         1. 하나의 계정으로 A가 로그인하면 세션이 생성된다.
         2. 동일한 계정으로 B가 로그인하면 또 세션이 생성된다.
         3. 이전 사용자였던 A의 세션을 만료시키고, B의 세션을 지속시켜 세션 개수를 유지시킨다.
maxSessionsPreventsLogin(false) // 기본값

이렇게 설정하면 아래와 같이 된다.

  1. 현재 사용자 인증 실패
  • 이미 로그인이 되서 세션이 생성되었다면, 세션이 새로 생성되지 못하도록 한다.
  • 대강 흐름은 다음과 같다.
         1. A가 로그인을 하고 세션이 생성된다.
         2. 동일한 계정으로 B가 로그인 하려고하면 예외를 발생시킨다.
maxSessionsPreventsLogin(true) 

이렇게 설정하면 아래와 같이 된다.

2-3. 세션 고정 보호

2-3-1. 개념 및 설명

세션 고정 보호를 말하기 전에, 세션 고정 공격을 알아야 하는데 세션 고정 공격의 흐름은 대강 아래와 같다.

  • 세션 고정 공격
  1. 공격자가 서버에 접속한 후 발급받은 SESSIONID를 사용자에게 심는다.
  2. 사용자는 공격자가 심어놓은 SESSION으로 로그인을 하고, 사용자는 로그인을 성공하게 된다.
  3. 공격자가 발급받은 SESSIONID로 인증되어있기 때문에 공격자는 사용자 정보를 공유하게 된다.

이러한 세션 고정 공격을 방지하도록 하기 위해서 스프링 시큐리티에서 세션 고정 보호의 기능을 제공한다.

매커니즘은 간단하다.
인증을 성공할 때마다 새로운 세션을 생성하고 발급한다.
이전 SESSIONID와는 전혀 다르기 때문에 세션 고정 공격을 방지할 수 있다.

세션ID를 바꾼 후, V체크를 한 후 새로고침을 하고, 진행하면 원활하게 진행된다.
✅ 참고로 이전 포스팅EditThisCookie를 적극 활용했다.

2-4. 세션 정책

세션 정책은 스프링 시큐리티에서 세션을 어떻게 제어할지 설정하는 것이다.

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

이건.. 더 설명할 게 없다.
아 참고로 Stateless는 보통 JWT를 사용할 때 설정한다.
아.. 오해하지 말아야 할 것은
무조건 세션을 사용하지 않는다! 가 아니라, JWT를 사용하기 떄문에 세션을 사용하지 않는 것 이다...

이전 포스팅의 언급했던 훌륭한 컨텐츠 제작자와 강의 컨텐츠 제작자 또한 동일하게 말한다.


3. 요약

  1. AnounymousAuthenticationFilter는 익명사용자와 인증사용자를 구분하기 위한 용도로 사용한다.
  2. 스프링 시큐리티에서는 동시 세션 제어를 위한 두가지 전략을 제공한다.
         2-1. 이전 사용자 세션 만료
         2-2. 현재 사용자 인증 실패
  3. 세션 고정 공격을 보호하기 위한 기능을 스프링 시큐리티에서 제공한다.
  4. 세션 정책은 커스터마이징 하되 Statelesss 는 보통 JWT를 사용할 때 설정한다.

4. 푸념

스프링 시큐리티 쉽지않다...강의 정리 최대한 지양하려고 했는데,,,다행히 무지성 받아적기는 아니었다. 최대한 간략하게 글을 써내려가기 위한 요약을 하고 담으려 했는데도.. 하하하.. 빡세다

강의들으면서 메모장에 적고, MD로 옮기면서 표현 정제, 정리 다시하고,,,
이제 그냥 편하게 영한님 스프링 강의들으러 가야겠다..

부트캠프 매인 프로젝트... 리팩터링, 문제 해결 다 잡고만다...


-끝-

728x90
Comments