본문 바로가기

SpringSecurity

SpringSecurity(SecurityContextPersistenceFilter)

반응형

SecurityContext 객체의 생성, 저장, 조회

 

익명 사용자(Anonymous)

  • 새로운 SecurityContext객체를 생성하여 SecurityContextHolder 에 저장
  • AnoymousAuthenticationFilter 에서 AnonymousAuthenticationToken 객체를 SecurityContext에 저장

인증시

  • 새로운 SecurityContext 객체를 생성하여 SecurityHolder 에 저장
  • UsernamePasswordAuthenticationFilter에서 인증 성공 후 SecurityContext에 UsernamePasswordAuthentication 객체를 SecurityContext에 저장
  • 인증이 최종 완료되면  Session에 SecurityContext 를 저장

인증후

  • Session에서 SecurityContext를 꺼내어 SecurityContextHolder에서 저장
  • SecurityContext안에 Authentication 객체가 존재하면 계속 인증을 유지한다

최종 응답 시 공통

  • SecurityContextHolder.clearContext()

 

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

사용자가 요청을 하게 되면 SecurityContextPersistenceFilter는 매요청마다 받은 요청을 처리하는곳이다

필터는 부적으로  ContextRepository 클래스가 SecurityContext객체를 생성하고 조회하는 클래스이다

인증을 받는 시점에는 Session에 SecurityContext가 없기 때문에 새로 생성해주고 SecurityContext의 값은 null이다.

이후에는 만약 폼인증 방식 같은 경우라면 AuthenticationFilter가 되고 인증에 성공한 결과와 권한정보를 SecurityContext에 담아준다

그정보를 SecurityContextPersistenceFilter가 Session에 저장하고 최종적으로 클라이언트에게 보낸다.

 

인증을 받은 이후에는 Session에서 SecurityContext 객체가 있는지 확인을 하고 그정보들을 가져와서 다시 SecurityContext에 저장한다 .SecurityContext에는 Authentication(인증객체)가 존재하기 때문에 사용자는 별도의 인증을 거치지 않고 서버자원에 접근이 가능하다

 

 

자 여기서 복습하자면 인증을 시도할때 SecurityContext를 생성해준다 그리고 인증후에 동일한 SecurityContext를 다시 생성해준다

이유는 인증을 시도할때는 유저의 이름과 패스워드를 저장해서 이정보들을 인증처리를 하고 인증이후에는 인정에 성공한 결과와 권한정보를 담아줘야 하기 때문에 새로운SecurityContext를 생성한다

 

 

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

 

자 여기서 복습하자면 인증을 시도할때 SecurityContext를 생성해주고 ThreadLocal에 저장한다 그리고 인증후에 동일한한 SecurityContext를 다시 생성해준다 이유는 인증을 시도할때는 유저의 이름과 패스워드를 저장해서 이정보들을 이용하여 인증처리를 하고 인증 이후에는 인증에 성공한 결과와 권한정보를 담아줘야 하기 때문에 새로운SecurityContext를 생성한다 그리고 생성된 SecurityContext는 할당된 Thread밖에 참조를 못하기 때문에 기본전략말고 두번째 전략인 MODE_INHERITABLETHREADLOCAL사용하게되면 자식Thread도 SecurityContext를 참조 할수 있다.

 

 

SecurityContextPersistenceFilter

HttpSessionSecurityContextRepository

SecurityContextPersistenceFilter

이필터는 내부적으로 SecurityContextRepository 구현 클래스를 가지고 있다. 이클래스가 현재 SecurityContext객체를 생성하고 조회하는 역활이다.  이필터는 매요청마다 받은 요청을 처리한다 

 

 

SecurityContextPersistenceFilter

현재 필자는 한번도 인증을 받지 않았기 때무네 세션이 null로 확인된다 그래서 새로운 SecurityContext를 생성이후에 ThreadLocal에 저장되고 다음 필터로 전달하게된다

 

AnonymousAuthenticationFilter.java

 그리고 현재 사용자는 익명 사용자이기 때문에  즉 Authentication(인증객체)가 널이기때문에 AnonymoustFilter에서 전달 받아서 익명사용자 토근을 만들어서 기본적인 정보를 담아서 SecurityContextHolder에 저장한다  익명사용자라고 할지라도 사용자가 인증받은 사용자인지 받지 않은 사용자인지 비교해야하기 때문에 SecurityContextHolder저장한다. 다만 세션에만 저장하지 않을뿐이다.

 

StandarSessionFacede.java

인증을 시도하더라도 아직 session에는 SecurityContext가 없다 

 

AbstractAuthenticationProcessingFiler.java

인증을 성공하게되면 인증결과를 담아서 SecurityContext객체안에 저장한다 그렇기 때무에 get을 이용해서 어디에서든지 인증객체를 참조할수 있다.

 

 

 

 

현재 사용자는 인증을 완료한상태가 그러면 익명사용자가 아니라고 판단하고 Session에 저장하는데 저장할때 key값으로저장한다 

 

 

 

 

StandardSessionFilter.java

이제는 사용자가 인증에 성공한 사용자가 요청을 하게되면 session에서 가지고 온다 새로 생성하지 않는다 그리고 SecurityContextHolde에 저장한다. 이제 사용자는 이제 인증과정을 거치지 않아도 인증을 계속해서 유지할수 있게 되고 권한에 해당하는 서버자원에 접근이 가능하다.

 

 

SecurityContextPersistenceFilter는 처음 사용자가 로그인을 시도하게 되면 SecurityContext를 생성해서 SecurityContextHolder에 저장하는 역활을 하고 이후에 인증이 성공하게되면 Session에서 SecurityContext를 가져와서 SecurityContextHolder저장후 다음 필터로 이동하게된다.

반응형