SpringSecurity V2

Shaun·2022년 1월 9일
1

Spring Security

목록 보기
6/19

동시세션제어 / 세션고정보호/ 세션 정책

동시세션제어

  • 말그대로 세션이 동시에 일어났을떄 처리 과정이다

  • 크게 두가지로 나눌수있다.
    -최대 세션을 1개로 설정해 놓을경우, 사용자가 로그인을 하고(세션저장) 사용자 2가 또 인증을 시도할경우 이전사용자 세션을 만료시키는 경우
    -인증이 된상태에서(세션저장) 사용자2의 인증을 실패하는 경우

  • maximumSession() 으로 동시접속 할수 있는 세션의 개수를 설정 할수 있다.
  • maxSessionPreventsLogin() 이 코드로 위에서 말한 두가지의 방법중 하나를 선택 할수있다. 후에 인증을 시도하는 유저를 인증 실패로 하던가(true) 이전 사용자 세션을 만료시켜버릴수도 있다.(false)

세션고정보호

  • 공격자의 세션(인증성공 토큰) 을 다른 사용자가 사용하게 하고 인증을 성공시키면 공격자는 사용자의 정보를 공유 할수 있다.

  • 이점을 해결하기위해 sessionFixation().changeSessionId() 가 있다. 말그대로 요청을 할때마다 세션값이 바뀐다는 것이다.

  • 이렇게 요청때마다 세션값을 바꾸면 남의 세션값을 사용하는 일은 없을것이다.

세션정책

  • 그 외에도 세션정책을 설정 할수 있다. 세션을 사용할지 안할지 필요할때만 사용할지등등 세션 사용여부를 설정 할수있다.

cocurrentManagementFilter

  • 매요청시마다 세션만료 체크
  • 세신이 만료로 설정되었을때 즉시만료 처리

  • 즉시 로그아웃 처리되며 즉시 오류페이지 처리

  • 세션 동시접속으로 인해 그 이전의 계정 세션이 만료 처리되고 그 이전의 계정으로 로그인을 시도하면 ConcourrentSessionFIlter 가 세션 만료처리를 보고 쳉크한다. 만료되었으면 로그아웃 시키고+ 오류메세지 내보냄

인가

  • 지금까지 로그인, 즉 인증을 알아봤다 .이제는 권한을 주는 를 알아보자

  • andtMatchers(URL)을 설정해주고 .hasRole(권한) 설정한 권한이 있는 사용자만 이 페이지에 접속 가능하다는 뜻이다.

  • loginPage.permitAll() 로그인 페이지 같은 경우는 인증을 한유저, 하지않은 유저, 누구나 접속 가능하게 만들었다는 뜻이다.

  • 구체적 경로가 먼저와야 한다! 왜냐하면 더큰 범위, 더 넓은 권한이 먼저 오면 해당경로에 그 권한이 없어도 접속 가능하기때문

  • 그외에 다른 기능들도 정리 해봤다.

ExceptionTraslationFilter RequestCacheAwareFilter

ExceptionTraslationFilter

  • AuthenticationEntryPoint =로그인 실패시 다시 로그인 페이지로 처리
    ->우리가 이 인터페이스를 직접 구현해서 로직 만들수있다
  • 실질적으로 요청정보를 저장 하는곳은 savedRequest.구현체를 다시 세션에 저장하는게 RequestCashe =>. Ex) 로그인안하고 USER권한 페이지 접속 -> 로그인화면 /로그인후 -> 그페이지로 이동
  • 처음 인증안하고 (익명유저) 권한 페이지 접근시 accessDeninedExceptin 발생 -> 익명사용자 또는 remember me 사용자 인증이면 AuthnticationExcepiton 호출

  • 맨처음 은 로그인실패 조차 받지않은 상태라 '인가' 오류가 나고 로그인 실패를 해도 익명사용자로 '인증' 이 됐기때문에 그떄서야 AuthenticatinException 이 발생한다.

  • 각각 인증 실패시 /인가 실패시 로직을 구현 할수있다.

DelegatingFilterProxy

  • Servlet Filter(왼쪽) 은 서블린 컨테이너에서 만든거라 Spring Bean(컨테이너가 다름) injection 불가

  • Sprig Bean 에서 Servlet Filter 를 구현한다

  • but 요청이오면 Servlet Filter(왼쪽이) 먼저 가로 챈다

  • 오른쪽 SpringBean이 FilterChainProxy

-> 그걸 해결하기 위해 나온게 ‘DeglegationFilterProxy
=> 요청(Request)을 Servlet Filter (왼) 받고 -> Del egationgFilter -> Spring Bean 순서

FilterChainProxy

1.springSecurityFilterChain 의 이름으로 생성되는 필터 빈
2. DelegatingFilerProxy으로 부터 요청을 위임받고 실제 보안처리
3. 스프링 시큐리티 초기화 시 생성되는 필터들 관리
-스프링 시큐리티가 기본적으로 생성하는 필터
-설정 클래스에서 API 추가시 생성되는 필터
4. 사용자의 요청을 필터 순서대로 호출하여 전달
5. 사용자정의 필터를 생성해서 기존의 필터 전.후로 추가기능
6. 마지막 필터까지 다통과하고 인증,인가 예외가 발생하지 않으면 보안통과후 서블릿이 요청처리

=> 요청 을 DelegatingFilterProxy가 가장 먼저 받고 그걸 FilterChainProxy에 위임, FilterChainProxy는 요청을 필터들을 통과시킨후 문제가 없으면 서블릿이 요청처리 시작

다중보안 설정

  • httpSecurity 에서 만든 필터설정과 RequestMatcher로 url 설정한 부분이 SecurityFilterChain안에 저장된다

  • 그 SecurityFilterChain들을 또 FilterCahinProxy 안에있는 SecurityFilterChains 변수에 저장을 한다.

  • FilterChainProxy가 두가지의 filterCahin이 있지만 요청이 들어올경우 RequestMacher 매칭되는 필터가 작동하도록 구성 되있다.

  • order() 로 먼저 스프링시큐리티가 검사할 순서를 정한다. 항상 디테일한 URL정보가 들어있는 쪽을 우선순위로 한다. 그렇지 않으면 그것이 더 큰 범위에 포함돼 인증없이 접속이 가능해질수 있기떄문이다.
profile
호주쉐프에서 개발자까지..

0개의 댓글